diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..ce75319
Binary files /dev/null and b/.DS_Store differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1bd47c1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+/secrets.py
+/node/live_variables.js
+/node/variables.js
+/stack/
+/origin/images/
+/electron/dist/
+/electron/node_modules/
+/node/node_modules/
+/scripts/node_modules/
+*.pyc
+*.pem
+*.pub
+/scripts/test.js
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..bdf8a87
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,24 @@
+LICENSE: AdventureLandOnlyUse
+
+Adventure Land Only Use:
+
+- You can't sell the source code or files
+- You can use or modify the source code or files without permission, this license still applies to the modified source code or files
+- You can sell game copies, subscriptions without permission, but can't sell the source code or files itself
+- Usage of the source code or files or any modification can be revoked and you accept that you'll immediately seize usage
+- You are responsible for any legal issues and costs arising from the use of this code or files
+- You are responsible for all legal costs of AdventureLandOnlyUse licensing disputes
+- You are free of this license if you completely rewrite a derivative game from scratch using different technologies and a new Codebase
+- Updates to this license are binding for existing copies of this code and it's up to the user of the code to keep up to date
+- Attribution is required. If there is a website, a crawlable link back to https://adventure.land is required
+- Notification of a public launched version is required. Please email hello@adventure.land before or after publishing your game. Your game can be showcased or promoted without permission.
+- Ethical use is required. Games shouldn't promote discrimination, hatred etc.
+- With permission you can brand under https://adventure.land to kickstart your game without any asset licensing worries, but you are solely responsible for your own game
+
+Goodwill Income Sharing:
+
+If you choose so, you can send 5% of gross income or 10% of net. income to me via any means, Wise is preferred or email hello@adventure.land for a method. This is completely optional.
+
+Explanation:
+
+I've open sourced my game with the hope that it can kickstart new experimental MMORPG dynamics in days rather than years, so developers can even use the code commercially without any worries and significant obligations. This license is mainly to prevent unethical usages.
diff --git a/README.md b/README.md
index c09d675..2269f6d 100644
--- a/README.md
+++ b/README.md
@@ -1,101 +1,143 @@
-# adventureland
-CODE Documentation for Adventure Land MMORPG https://adventure.land
+# Adventure Land - The Open Source CODE MMORPG
+https://adventure.land
+The Source Code is now available to anyone, even for commercial use! (License applies)
+**Please consider supporting Adventure Land on Patreon: https://www.patreon.com/AdventureLand**
-Ps. Right now the documentation is in-game at https://adventure.land/docs
+## Discussion
-Ps 2. Type /codes in the Steam or Mac client, the auto synced folder also includes relevant libraries
+Consider using the #development channel on Discord or messaging me directly on Discord as it's an easy way to communicate: https://discord.gg/hz25Kz9FsH
+## Installation
-
+Clone the game files into the adventureland folder:
+```sh
+git clone https://github.com/kaansoral/adventureland adventureland
+```
+Clone a modified copy of Python2 App Engine Local App Server into the python folder along with an initialized database with map files:
-### Character / Players / Monsters
+```sh
+git clone https://github.com/kaansoral/adventureland-appserver appserver
+```
+You'll need to download Python2.7 and use the command that comes along with it - it could be ./python or python.exe depending on your setup method
+Here's the download page: https://www.python.org/downloads/release/python-2718/
+For Linux:
+```sh
+apt update
+apt upgrade -y
-* Properties
- * .real_x
- * .real_y
- * .hp / .max_hp
- * .mp / .max_mp
- * .xp / .max_xp
- * .party / .name / .rip / .afk / .code / .target / .id / .moving + more
-* show_json(character) to see all the properties
+apt install python2.7 git -y
-### Things to Inspect
+wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
+sudo python2.7 get-pip.py
+pip2.7 check
+```
-Replace everything on CODE with these show_json's
+For MacOS pyenv makes sense as it prevents clash between Python versions and allows local versioning by just adding a .python-version to the folder https://github.com/pyenv/pyenv
-* `show_json(character)`
-* `show_json(character.items)`
-* `show_json(character.slots)`
-* `show_json(get_target())`
-* `show_json(parent.G.monsters)`
-* `show_json(parent.G.items)`
-* `show_json(parent.G.skills)`
-* `show_json(parent.G.npcs)`
-* `show_json(parent.M)`
+Make sure to install lxml afterwards:
+```sh
+pip2.7 install lxml
+```
-### Provided Functions
+Run the Python2.7 backend - includes an HTTP server, datastore, various utilities - emulates Google App Engine:
+```sh
+python2.7 appserver/sdk/dev_appserver.py --storage_path=appserver/storage/ --blobstore_path=appserver/storage/blobstore/ --datastore_path=appserver/storage/db.rdbms --host=0.0.0.0 --port=8083 adventureland/ --require_indexes --skip_sdk_update_check
+```
-#### move(character.real_x,character.real_y)
-Moves the character
+Set up the NodeJS project for helpful scripts:
+```sh
+npm install adventureland/scripts/
+```
-#### get_nearest_monster({max_att:100,min_xp:10,target:"Name",no_target:true})
-Return's the nearest monster, you might want to target that return value with `change_target`
+Set up the NodeJS game server:
+```sh
+npm install adventureland/node/
+```
-target: Picks monsters that only target that name
+Edit the paths in `adventureland/node/variables.js`
-no_target: Picks monster that aren't targeting anyone
+Run a server:
+```sh
+node adventureland/node/server.js EU I 8022
+```
-#### use_hp_or_mp()
-Uses a very basic logic to either use hp or mp pot
+You should be able to access the game at: http://0.0.0.0:8083/
-#### get_target()
-Returns your current target
+The **useful/** folder has useful commands
-#### get_target_of(entity)
-New, powerful feature, returns the target entity for both players and monsters
+`secrets.py` has the secrets
-Suggestion for Fun: Code your characters to target and attack what you are targeting, even if you don't engage a monster, you can make your characters (or side-characters) engage by just clicking :)
+## Network
-#### change_target(target)
-Targets the player or monster
+Add these to your /etc/hosts file:
+```sh
+0.0.0.0 thegame.com
+0.0.0.0 www.thegame.com
+```
-#### loot()
-Loots the chests on the map
+And setup nginx with a conf such as:
+```sh
+worker_processes 3;
-#### attack(target)
-Attacks the target
+events {
+ worker_connections 2048;
+}
-#### heal(target)
-Heals the target
+http {
+ include mime.types;
+ default_type application/octet-stream;
-#### game_log(message,color)
-Adds a message to game's right log
+ sendfile on;
-#### show_json(character.items)
-Renders the argument as json, to inspect, learn, use
+ keepalive_timeout 0;
+ proxy_read_timeout 200;
+ proxy_connect_timeout 30;
+ proxy_send_timeout 200;
-#### set_message("Code Active")
-Sets the IFrame message, the one in the right bottom corner
+ server {
+ listen 8080;
+ server_name thegame.com;
+ location / {
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_redirect off;
+ proxy_pass http://localhost:8083;
+ expires -1;
+ }
+ }
-#### runner_functions.js
-There are more functions, examples in runner_functions.js and on the game's main CODE
+ include servers/*;
+}
+```
-### Future Plans
-As the game progresses, the CODE feature will refine, you will be able to create/save your own code in-game, and hopefully much much more
+This way you can run multiple different projects at once and reach them using a local url of your choice, my choice was thegame.com
-With the introduction of PVP, Trade, Events and similar stuff, the CODE capabilities should get pretty interesting
+If you choose to go live with the development server, make sure to block external access to every `login: admin` url you see in **app.yaml**. You could do this via a custom authentication or via nginx etc.
-I'm also planning to add Networking between characters, so one might create a small team of bot helpers, or create a PVP team that consist entirely of bots
+## How to Contribute
-### Usage / Notes
-* You have to keep the browser focused
-* Otherwise browsers slow down the game
-* Opening the game in a new window might be a good idea
-* Keep in mind that CODE is currently an early prototype
-* CODE runs in an IFrame, feel free to interact with **parent**
-* You are free to inspect the client game code
-* You can freely emulate a regular player
-* Please don't use the CODE to hinder other players or the server
-* You should be safe as long as the interval is 250ms
-* Feel free to use Github Issues for Questions
-* Ideally, at each Interval, move, attack, use/buy only once :)
+This repository is the live version of the game. Any changes made will be live when the game is updated. Please create a Discord discussion in the **#development** channel before working on any big changes so your efforts aren't wasted or clash with the efforts of another contributor. Alternatively you can create a Github Issue if you don't use Discord.
+
+Content additions are very welcome, if you inspect the map data, there are many zones created yet not integrated. I'd be very happy to guide potential contributors in adopting and authoring a new zone, a new event, a new monster, a new mechanic and so on.
+
+I will include graphical assets, new item images manually. Please email them to hello@adventure.land
+
+## Suggestions
+
+I suggest you go live with this development codebase and approach development in a very agile manner, you can then move onto cloud if you wish to. My suggestion is to never move onto cloud and building a custom infrastructure using cheap dedicated servers with unlimited bandwidths.
+
+The main problem with traditional MMORPG's is people seeking power and while an offline game can provide this for everyone, an online game cannot. Pretty soon new players will avoid such MMORPG's and existing players will also dwindle. In my opinion there are 2 solutions, you could introduce a decay mechanic to overcome this, or concentrate your innovations and additions to make a more social game rather than a game for power hungry people. Originally I intended to add a lot more social integrations, for example browser notifications integrated to the social hub of the game and easy drop ins to friends playing the game etc. So making a more idle and more social game, with new custom art and a new direction could also be a good option, it's definitely the more serene option that anyone can pursue.
+
+## Freelancers
+
+Adventure Land's map designer is available for freelance work or for hire. Contact: markjlacandula@gmail.com
+
+I'm also available for working freelance on an hourly basis. Contact: hello@adventure.land
+
+If you have specific requirements, for example a unique cloud architecture in mind, I can help you find someone within our community that can handle the job. If you are an artist/designer and looking for a programmer to work on a game with, our Discord is also a good place to find someone!
+
+## License
+
+https://github.com/kaansoral/adventureland/blob/master/LICENSE
\ No newline at end of file
diff --git a/TODO.txt b/TODO.txt
new file mode 100644
index 0000000..29f18d4
--- /dev/null
+++ b/TODO.txt
@@ -0,0 +1,12 @@
+- X button for mobile CODE to be able to hide
+- TUTORIAL STEP: ITEM UI
+- Merchant skills give XP
+- Re-visit server.js 'creward' / 'ureward'
+- Make spawns spawn on people who attacked
+- IDEA: A lobby for A/B Testing
+- Fix renaming of character code files, renaming one in the game UI breaks things
+
+
+- SPIKE 2400 HP
+
+There's a character with an item that has a "name" set as an [] array - find and fix it [28/06/23]
\ No newline at end of file
diff --git a/WEEK.txt b/WEEK.txt
new file mode 100644
index 0000000..cd42b05
--- /dev/null
+++ b/WEEK.txt
@@ -0,0 +1,5 @@
+- All the negative conditions are now affected by "stresistance" and sent as a "condition" character event
+- There's a new very aggressive male Harpy
+- Cuteness adds a negative aggro difference - this way >1 aggro values make some sense too
+- Bling adds a positive aggro difference - this way even peaceful monsters could attack you
+- New Item: Harpy Bow - along with its own crafting recipe, Harpy's both drop the crafting material and the bow itself, so it's not just low-RNG based and there'll be a slow but steady progress too
\ No newline at end of file
diff --git a/admin.py b/admin.py
new file mode 100644
index 0000000..86c0b23
--- /dev/null
+++ b/admin.py
@@ -0,0 +1,190 @@
+from config import *
+from functions import *
+
+class Renderer(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self):
+ whtml(self,"utility/htmls/renderer.html",domain=gdi(self))
+ def post(self): self.get()
+
+class Events(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self,tag):
+ cursor=gdmul(self,"cursor")
+ if not tag: tag="noteworthy"
+ if tag=="all": events=Event.query().order(-Event.created)
+ else: events=Event.query(Event.tag==tag).order(-Event.created)
+ if cursor: events,ncursor,more=events.fetch_page(100,start_cursor=ndb.Cursor(urlsafe=cursor))
+ else: events,ncursor,more=events.fetch_page(100)
+ ncursor=more and ncursor.urlsafe()
+ whtml(self,"utility/htmls/events.html",domain=gdi(self),events=events,ncursor=ncursor)
+ def post(self,tag): self.get(tag)
+
+def executor_task(the_code):
+ self=None
+ try:
+ exec(the_code)
+ except:
+ #admin_email(domain,"executor_task failed")
+ log_trace()
+
+class Executor(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self):
+ whtml(self,"utility/htmls/executor.html",domain=gdi(self))
+ @ndb.toplevel
+ def post(self):
+ the_none="the_none_output_48"
+ the_code,is_task=gdmul(self,"code","is_task"); output=the_none; json_output=None; json_size=0; html_output=the_none; output_html=the_none; inspect=the_none; ess=datetime.now()
+ logging=custom_logging()
+ #logging=code_logs
+ if is_task:
+ deferred.defer(executor_task,the_code,_queue="default")
+ output="executor_task triggered"
+ else:
+ try:
+ exec(the_code)
+ except DeadlineExceededError: logging.error("Deadline Exceeded")
+ except:
+ log_trace_i("",logging)
+ if json_output!=None: json_size=olen(json_output); json_output=json.dumps(recursive_datetime_conversion(json_output))
+ if html_output!=the_none: output_html=html_output
+ whtml(self,"utility/htmls/executor_output.html",logs=logging.output(),created=datetime.now(),ess_ms=mssince(ess),
+ output=output,json=json_output,json_size=json_size,html_output=output_html,inspector_output=(inspect!=the_none and ginspect(inspect,force_inspection=1)))
+
+class CommunityMapEditor(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self,name):
+ if not name: return
+ name=name.split("/")[0]
+ #if not ((name in community_maps) or name.startswith("jayson_")): return
+ domain=gdi(self); user=get_user(self,domain)
+ #if name.startswith("jayson_") and (not user or (user.k()+"") not in inner_circle): return
+ map=get_by_iid("map|%s"%name)
+ whtml(self,"utility/htmls/map_editor.html",domain=domain,name="main",map=map,tilesets=tilesets,community=1)
+ @ndb.toplevel
+ def post(self,name):
+ data=self.request.get("data")
+ name=name.split("/")[0]
+ if not ((name in community_maps) or name.startswith("jayson_")): return self.response.out.write("Not Permitted!")
+ domain=gdi(self); user=get_user(self,domain)
+ if name.startswith("jayson_") and (not user or (user.k()+"") not in inner_circle): return self.response.out.write("Not Permitted!")
+ map=get_by_iid("map|%s"%name)
+ if not map: map=Map(key=ndb.Key(Map,name),info=GG())
+ map.info.data=json.loads(data)
+ process_map(map)
+ map.updated=datetime.now()
+ map.put()
+ copy_map(name,"test")
+ self.response.out.write(to_pretty_num(olen(map.info.data)))
+
+class MapEditor(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self,name):
+ if not name: self.redirect("/admin/map_editor/main"); return
+ name=name.split("/")[0]
+ map=get_by_iid("map|%s"%name)
+ whtml(self,"utility/htmls/map_editor.html",domain=gdi(self),name="main",map=map,tilesets=tilesets)
+ @ndb.toplevel
+ def post(self,name):
+ data=self.request.get("data")
+ name=name.split("/")[0]
+ map=get_by_iid("map|%s"%name)
+ if not map: map=Map(key=ndb.Key(Map,name),info=GG())
+ map.info.data=json.loads(data)
+ process_map(map)
+ map.updated=datetime.now()
+ map.put()
+ copy_map(name,"test")
+ self.response.out.write(to_pretty_num(olen(map.info.data)))
+
+class Selector(webapp.RequestHandler): #NOTICE: << Publicly available at /communityselector! >> [10/10/16]
+ @ndb.toplevel
+ def get(self,name):
+ if not name: self.redirect("/admin/selector/pack_1a"); return
+ name=name.split("/")[0]
+ file=imagesets[name]["file"]
+ size=imagesets[name]["size"]
+ width=imagesets[name]["columns"]*size
+ height=imagesets[name]["rows"]*size
+ xs=[]; ys=[]
+ for i in xrange(width/size): xs.append(i)
+ for j in xrange(height/size): ys.append(j)
+ whtml(self,"utility/htmls/selector.html",domain=gdi(self),name=name,file=file,size=size,width=width,height=height,xs=xs,ys=ys,scale=3)
+ def post(self,name): self.get(name)
+
+class PhotoUpload(blobstore_handlers.BlobstoreUploadHandler):
+ @ndb.toplevel
+ def post(self):
+ domain=gdi(self); user=get_user(self,domain)
+ if security_threat(self,domain): return
+ upload_files = self.get_file_infos('image'); file_info = upload_files[0]; blob_key=blobstore.create_gs_key_async(file_info.gs_object_name)
+ key=gdmul(self,"key");
+ logging.info("Image Upload %s"%(key))
+ upload=get_by_iid("upload|%s"%key); blob_key=blob_key.get_result()
+ if not upload: upload=Upload(key=ndb.Key(Upload,key),info=GG())
+
+
+ if file_info.content_type in ["image/jpg","image/jpeg","image/jpe","image/png","image/gif"]:
+ if gf(upload,"blob_key"):
+ try:
+ blobstore.delete(blob_keys=upload.info.blob_key)
+ logging.info("Old image deleted")
+ except: log_trace()
+
+ url=get_serving_url(blob_key,size=images.IMG_SERVING_SIZES_LIMIT)
+ size=get_image_size(blob_key,encoding=filetype_to_image_encoding(file_info.content_type))
+
+ upload.info.blob_key=blob_key
+ upload.info.content_type=file_info.content_type
+ upload.info.gs_object_name=file_info.gs_object_name
+ upload.info.url=url
+ upload.info.width=size.width
+ upload.info.height=size.height
+
+ self.response.out.write("{ Paragraph item_grade <- reference label G.classes <- json label Move There <- execute label "hit" <- display Hint: <- hint
+ The snowman spawns every hour. Snowman is a collaborative boss, everyone who participates gets a reward. You can only deal 1 damage to Snowman - better participate at each spawn for the common good!
+ [Learning Coding is Easy] Before you start the journey, let me assure you that learning how to Code is super easy, anyone can do it, you can easily do it, just stick along :) Programming Languages are a lot like Microsoft Word, there are a lot of itsy bitsy features, imagine seeing Microsoft Word for the first time, all those functionalities, interfaces that you don't know what to do.. They would intimidate you, right? Yes it would. But anyone can use a text editor, you just type stuff, maybe make it bold, italic, If you are a pro at it, maybe align the text a bit, and that's it! <- Well coding is a lot like that too! If you are not a coder, all the things that you don't know must be scaring you, scaring you so much that you could be believing that you can't do it. Well, know this: Things you don't know are a lot like the stupid functionalities Microsoft Word has, no normal person is going to use them, you don't need to know them, you can write a masterpiece novel and not know anything about them. Coding is a lot like using a Text Editor, or a Calculator, it's just a tool to help you automate, to make computers do things for you, and in Adventure Land, you can make Code play the game for you :) The Secret: You don't need to learn everything about a programming language, you just need to learn very little, and the rest, you can Google! Adventure Land is written in Javascript, and you'll learn Javascript. Using Javascript is as simple as: As you probably guessed, we used Javascript like a Calculator, the above program alerts "35". Some more explanation: [Security First!] In our daily lives, we run codes, programs, games - all from different resources. And we assume these will be safe, and others will make sure they are safe. You have no other choice, as you can't see or inspect everything your computer runs. However on Adventure Land you have the chance to quickly glance at every line of a Code you'll copy-paste from a fellow player, and you must! Doesn't matter if you are a Coder or not, it's usually easy to spot malicious Code! Here's a quick Checklist: If you can't be sure, you must-not! copy-paste Code from someone else, and run it! One example of a bad / malicious Code: Codes you copy-paste, should be as simple to you as: With a game, it's easy to ensure security, but as a friendly advice, keep in mind that we live in a bad world, with bad people, so make sure these people don't have anything on a good person like you, even if the worst case scenario happens, where they get access to all your personal files... Adventure Land uses a 2 dimensional coordinate system. If you start at (0,0) and move 100 pixels right, you end up at (100,0) If you start at (0,0) and move 100 pixels down, you end up at (0,100) Work in progress ... Work in progress ... Simplest way to move your character is the move method. However, as you'll notice, move can't pass obstacles or chart a smart course, this is where smart_move shines. Items are defined in G.items You can think of each G.items entry as a recipe for an item, the definition of the item. One example: It's of "type"/"weapon" - It's weapon type, i.e. "wtype" is "fist" - If you check G.classes - You can see which classes use "fist" weapons. The item's visible "name" is "Frozen Claw" - keep in mind that the item's keyname is "fclaw" "grades" property determines [At what level the item becomes High grade, At what level the item becomes Rare grade], so [0,7] means it's High grade at +0 and Rare grade at +7. Now that we know about the definition/recipe, we can move onto the actual items/products of these recipes. You can inspect your own items before we do so: character.items One example: So actual items refer to their definitions with their "name" attributes. It's the keyname from G.items Useful function: item_grade Work in progress / Incomplete In Code, skills are referenced by their keys from: G.skills One example is "supershot" you can check out: G.skills.supershot Reference functions: use_skill is_in_range is_on_cooldown Special Usage: 3-Shot Special Usage: Controlled Burst Special Usage: Blink Your characters each have their own code slots, the game client auto saves your code to the game servers each time you run your code after a change. In addition to character code slots, you have 100 additional code slots, numbered from 1 to 100! Whereas your character code slots have larger numbers like 482008842 - which are actually the ID's of your characters. You can check out: X.codes - which includes the dictionary of your codes. The Steam and Mac clients also synchronize a local folder to include all your codes, you can type /codes in chat to open this folder Your character codes are inside the characters folder with file names such as Wizard.482008842.js - Whereas your code slots are in the codes folder with names such as Farming.12.js - the number before .js matters a lot - it's how the game determines where to sync the file to. If you open the game on a different computer and there are old code files, they are moved to the history folder, when the game detects simultaneous conflicting changes, the file is moved to the clash folder. The code synchronization system is designed to be self healing and self synchronizing, but from feedback, currently it's not performing too well. If you can isolate a scenario it fails, it will help tremendously! Useful Functions: load_code require_code upload_code get_active_code_slot get_edited_code_slot Your character loads its default code slot when you open the game in a new place, if you use the character default slot, it will be practical to open the game on Steam/Web etc. - However, you can also make a character use any other code slot locally. It's a good idea to use the character default slots for high level logic, and put your functions and routines to numbered code slots and in your character code slot, load those codes using load_code which is pretty similar to just copy/pasting that entire code slot to the place where you load the code. Adventure Land communicates with it's backend through API calls. This backend system has access to all the servers and characters. While the API system is intended for manual use only, you can use this system to occasionally programatically check out your friends, or check out all the online merchants. Keep in mind that the data format and method names can change at any time in the future without a warning. To catch the response: Work in progress ... CLI is a command line game client for Adventure Land. It's currently in a very early stage, but the base integration is there. As the developer, from my perspective, allowing the game to be run from the command line is very risky. While Adventure Land is a coding and botting game, there's a just exchange between the use of server resources and the use of one's own gaming hardware. For this reason, the CLI comes with a cost. It's 29 shells per week for now. You can purchase time with the following command: (Up to 4 weeks) Ps. Characters up to Level 70 can run freely! To use the CLI, copy the files from: Here[GitHUB] - and copy common_functions.js to the same folder. (You can find it by typing /codes as a Chat command in the Steam or Mac client). The node packages you need to install are: jsdom request and node-localstorage JSDom performance is enough for light operations, but since it's an emulation, it's too slow for computations like smart_move, for this reason, the CLI has a system to move computation out, and communicate with messages, you can use this system too: You can either use the `cli_require` function inserted into the jsdom instance to request packages inside your game Code, or, you can use the same method to handoff objects or packages to the jsdom instance: Adventure Land has a feature called Code Messages. It's a server-wide feature. You can't send a CM from EU I to EU II, however, you can send a code message anywhere from EU I to another character in EU I. You can send objects as CM's, anything that can be JSON.stringify'ed can be sent, larger messages have higher code costs. To handle incoming CM's: Your original character is parent.character In Code, there's a character object that mimics and extends your character object, you can notice the difference if you show_json(character) show_json(character.slots) and show_json(parent.character) Nearby Characters, Monsters and Citizens are in the parent.entities dictionary. You can check how the Code function get_nearest_hostile parses this data. Nearby Characters, Monsters and Citizens are in the parent.entities dictionary. You can check how the Code function get_nearest_monster parses this data. show_json(G.monsters) includes the base stats, "attack", "frequency", "speed", "hp", "xp" increase until level 12. show_json(G.maps.main.monsters) is an example array of monster packs, if "grow" is set to true, that pack is marked for newcomers, these pack of monsters spawn faster and their stats increase less when they level up! Work in progress ... Character events are individual to your character. Data Reference: Work in progress ... Game events are ambient or global, they can either be broadcasted to the entire server or you can observe nearby happenings through these events. Data Reference: Work in progress ... Your Code and Javascript variables all reset when you refresh the game. Let's say you were in the middle of a very important action but your character got disconnected, or the game and servers started updating, what happens then? How do you continue what you were doing? How will your character remember what to do? This article will explain how! :) To solve this problem, you'll need a persistent storage solution, like saving a file somewhere. Luckily, browsers and our game clients have a service called "localStorage". The game functions get and set uses this local storage and they are very easy to use! Here's an example usage that makes your character move from Goo's to Tiny Crab's, even after the game is refreshed:
+ Arguments:
+
'%s':{'url':'%s','width':%s,'height':%s},
}"%(key,url,size.width,size.height))
+ upload.put()
+ else:
+ blobstore.delete(blob_keys=blob_key)
+ self.response.out.write("Not an image")
+ def get(self): self.post()
+
+class PhotoUploader(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self):
+ domain=gdi(self); user=get_user(self,domain)
+ if security_threat(self,domain): return
+ upload_url=blobstore.create_upload_url('/admin/upload/handler',gs_bucket_name=domain.gcs_bucket+"/files")
+ whtml(self,"utility/htmls/uploader.html",domain=domain,upload_url=upload_url)
+
+class Items(webapp.RequestHandler): #NOTICE: << Publicly available at /communityitems! >> [10/10/16]
+ @ndb.toplevel
+ def get(self):
+ domain=gdi(self)
+ #if not is_current_user_admin():
+ # user=get_user(self,domain)
+ # if not user or user.k()+"" not in [ellian_id,hello_id]: return
+ mode,items=gdmul(self,"mode","items")
+ whtml(self,"utility/htmls/items.html",domain=domain,mode=mode,items=items)
+ def post(self): self.get()
+
+class Backups(webapp.RequestHandler):
+ @ndb.toplevel
+ def get(self,m,id):
+ domain=gdi(self)
+ backups=Backup.query(Backup.backup_item_id=="%s|%s"%(m,id)).order(-Backup.backup_created).fetch(50)
+ whtml(self,"utility/htmls/backups.html",domain=domain,backups=backups)
+ def post(self,m,id): self.get(m,id)
+
+application = webapp.WSGIApplication([
+ ('/admin/renderer', Renderer),
+ ('/admin/executor', Executor),
+ ('/admin/items', Items),
+ ('/admin/upload', PhotoUploader),
+ ('/admin/upload/handler', PhotoUpload),
+ ('/admin/backups/(.*)/(.*)', Backups),
+ ('/admin/events/?(.*)', Events),
+ ('/admin/map_editor/?(.*)', MapEditor),
+ ('/admin/selector/?(.*)', Selector),
+ ('/admin/items', Items),
+ ],debug=is_sdk)
\ No newline at end of file
diff --git a/api.py b/api.py
new file mode 100644
index 0000000..baccc96
--- /dev/null
+++ b/api.py
@@ -0,0 +1,1738 @@
+from config import *
+from functions import *
+
+def signup_or_login_api(**args):
+ #time.sleep(10)
+ self,domain,email,password,only_login,only_signup,mobile=gdmuld(args,"self","domain","email","password","only_login","only_signup","mobile")
+ logging.info("Signup or Login")
+
+ try: email=purify_email(email)
+ except: return jhtmle(self,"Invalid Email")
+
+ if not password:
+ jjson(self,{"type":"eval","code":"$('.passwordui').show()"})
+ jhtmle(self,"No Password Entered");
+ return
+
+ existing=get_user(email=email,phrase_check=True)
+
+ if existing and existing.server:
+ if msince(existing.last_online)>15 and msince(gf(existing,"last_auth",really_old))>15: pass # [15/05/22]
+ else: jhtmle(self,"Can't login while inside the bank"); return
+ if not domain.electron and not only_login and not domain.is_sdk: jhtmle(self,"Can't signup on web"); return
+
+ if existing and not only_signup:
+ if existing.password==password or existing.password==hash_password(password,gf(existing,"salt","5")):
+ def login_transaction():
+ user=get_by_iid(existing.k('i'))
+ auth=get_new_auth(self,user,domain)
+ user.put()
+ return user,auth
+ user=ndb.transaction(login_transaction,xg=True,retries=12)
+ if user:
+ user,auth=user
+ set_cookie(self,"auth","%s-%s"%(user.k(),auth))
+ if mobile:
+ return jhtml(self,[{"type":"refresh"}]);
+ jhtml(self,[
+ {"type":"message","message":"Logged In!" },
+ selection_info(self,user,domain),
+ ])
+ else:
+ jhtmle(self,"Login Failed. Please Retry Later.")
+ return
+ jjson(self,{"type":"eval","code":"$('.passwordui').show()"})
+ jhtmle(self,"Wrong Password")
+ return
+
+ if not email: return jhtmle(self,"No Email Entered")
+
+ if only_login: return jhtmle(self,"Email Not Found In Records")
+
+ signupth=get_signupth()
+ ip=get_ip_info(self)
+ referrer=get_referrer(self,ip)
+
+ if gf(ip,"limit_signups",0)>=3: return jhtmle(self,"Too many signups from this IP. Please wait a couple hours or use a non-public network")
+
+ if only_signup and existing:
+ return jhtmle(self,"Email already signed up! Please login instead.")
+
+ def signup_transaction():
+ markedphrase=get_by_iid("markedphrase|%s"%dgt("email",email))
+ if markedphrase: return False
+ salt=randomStr(20)
+ hpassword=hash_password(password,salt)
+ user=User(name="#%s"%signupth,password=hpassword,email=[email],info=cGG(gold=1000,salt=salt))
+ user.referrer=(referrer and "%s"%referrer.k()) or ""
+ user.info.signupth=signupth
+ user.info.email=email
+ user.info.ip=get_ip(self); user.info.country=get_country(self)
+ user.info.characters=[]; user.info.slots=5
+ if domain.electron: user.info.slots=8
+ user.info.items=[]
+ user.info.everification=randomStr(12)
+ auth=get_new_auth(self,user,domain)
+ user.put()
+ mark_phrase(user,"email",email)
+ return user,auth
+ user=ndb.transaction(signup_transaction,xg=True,retries=12)
+
+ if not user: return jhtmle(self,"Signup Failed")
+
+ user,auth=user
+ set_cookie(self,"auth","%s-%s"%(user.k(),auth))
+ send_verification_email(domain,user)
+ jhtml(self,[
+ {"type":"success","message":"Signup Complete!" },
+ selection_info(self,user,domain),
+ ])
+ add_event(user,"signup",["new","noteworthy"],self=self,info=cGG(message="Signup %s"%(user.info.email)),async=True)
+ increase_signupth()
+
+ try:
+ ip=get_ip_info(self)
+ ip.info.limit_signups=gf(ip,"limit_signups",0)+1
+ put_ip_info(ip,user=user)
+ except:
+ log_trace()
+
+def settings_api(**args):
+ self,domain,user,setting,value=gdmuld(args,"self","domain","user","setting","value")
+ if not user: return
+ if user.server: return jhtmle(self,"Can't make changes while inside the bank")
+ def setting_transaction():
+ nuser=get_by_iid(user.k('i'))
+ if setting=="email":
+ if value: nuser.info.dont_send_emails=False
+ else: nuser.info.dont_send_emails=True
+ domain.section="email"
+ nuser.put()
+ return nuser
+ user=ndb.transaction(setting_transaction,xg=True,retries=0)
+ jhtml(self,[
+ {"type":"success","message":"Setting changed!" },
+ selection_info(self,user,domain),
+ ])
+
+def change_email_api(**args):
+ self,domain,user,email=gdmuld(args,"self","domain","user","email")
+ if not user: return
+
+ try: email=purify_email(email)
+ except: return jhtmle(self,"Invalid Email")
+
+ existing=get_user(email=email,phrase_check=True)
+
+ if existing:
+ if existing.k()!=user.k(): return jhtmle(self,"Email might be registered to someone else")
+ if gf(user,"verified",0): return jhtmle(self,"This email is already verified")
+
+ if user.server: return jhtmle(self,"Can't make changes while inside the bank")
+ if gf(user,"last_email_change") and hsince(gf(user,"last_email_change"))<18: jhtmle(self,"You can change your email once every 18 hours"); return
+ def change_email_transaction():
+ delete_phrase_mark("email",user.info.email)
+ markedphrase=get_by_iid("markedphrase|%s"%dgt("email",email))
+ if markedphrase: return False
+ nuser=get_by_iid(user.k('i'))
+ nuser.email=[email]
+ nuser.info.email=email
+ nuser.info.last_email_change=datetime.now()
+ if gf(nuser,"verified",0): del nuser.info.verified
+ nuser.info.everification=randomStr(12)
+ nuser.put()
+ mark_phrase(nuser,"email",email)
+ return nuser
+
+ user=ndb.transaction(change_email_transaction,xg=True,retries=2)
+ if not user: return jhtmle(self,"Operation failed")
+ send_verification_email(domain,user)
+ jhtml(self,[
+ {"type":"success","message":"Email changed! Verification email re-sent. Refresh the page."},
+ selection_info(self,user,domain),
+ ])
+
+def change_password_api(**args):
+ self,domain,user,epass,newpass1,newpass2=gdmuld(args,"self","domain","user","epass","newpass1","newpass2")
+ if not user: return
+ if user.server: return jhtmle(self,"Can't make changes while inside the bank")
+ if user.password!=epass and user.password!=hash_password(epass,gf(user,"salt","5")): jhtmle(self,"Wrong Password"); return
+ if not newpass1 or newpass1!=newpass2: jhtmle(self,"Passwords don't match"); return
+ def password_transaction():
+ nuser=get_by_iid(user.k('i'))
+ nuser.info.salt=randomStr(20)
+ nuser.password=hash_password(newpass1,nuser.info.salt)
+ nuser.put()
+ return nuser
+ user=ndb.transaction(password_transaction,xg=True,retries=0)
+ jhtml(self,[
+ {"type":"success","message":"Password changed!" },
+ selection_info(self,user,domain),
+ ])
+
+def reset_password_api(**args):
+ self,domain,id,key,newpass1,newpass2=gdmuld(args,"self","domain","id","key","newpass1","newpass2")
+ if not newpass1 or newpass1!=newpass2: jhtmle(self,"Passwords don't match"); return
+ user=get_by_iid("user|%s"%id)
+ if not user or gf(user,"password_key")!=key: jhtmle(self,"Invalid key"); return
+ if user.server: return jhtmle(self,"Can't make changes while inside the bank")
+ def password_transaction():
+ nuser=get_by_iid(user.k('i'))
+ nuser.info.salt=randomStr(20)
+ nuser.password=hash_password(newpass1,nuser.info.salt)
+ nuser.info.password_key=randomStr(20)
+ nuser.put()
+ return nuser
+ user=ndb.transaction(password_transaction,xg=True,retries=0)
+ jhtmls(self,"New password set!")
+
+def password_reminder_api(**args):
+ self,domain,email=gdmuld(args,"self","domain","email")
+ try: email=purify_email(email)
+ except: jhtmle(self,"Invalid Email"); return
+ existing=get_user(email=email,phrase_check=True)
+ if not existing: jhtmle(self,"Email not found"); return
+ if existing.server: return jhtmle(self,"Can't make changes while inside the bank")
+ if hsince(gf(existing,"last_password_reminder",really_old))<24: jhtmle(self,"Already sent a reminder recently (24 hours)"); return
+ def pmark_transaction():
+ user=get_by_iid(existing.k('i'))
+ user.info.last_password_reminder=datetime.now()
+ user.info.password_key=randomStr(20)
+ user.put()
+ return user
+ user=ndb.transaction(pmark_transaction,xg=True,retries=2)
+ send_password_reminder_email(domain,user)
+ jhtmls(self,"Emailed password reset instructions")
+
+def account_change_api(**args):
+ self,domain,user=gdmuld(args,"self","domain","user")
+ jhtmlm(self,"Coming Soon: Re-Verification, Email Change, Password Change - For now, if you need something, just email hello@adventure.land")
+
+def log_error_api(**args):
+ self,domain,user,server,type,err,info=gdmuld(args,"self","domain","user","server","type","err","info")
+ logging.info(server)
+ if user and type not in ["api_call_error"]: return
+ if server and type not in ["appengine_call_error"]: return
+ if user:
+ add_event(user,"client_error",["error",type],self=self,info=cGG(message="[%s] %s"%(type,err),info=info))
+ if server:
+ add_event(server,"server_error",["error",type],self=self,info=cGG(message="[%s] %s"%(type,err),info=info))
+ jhtml(self)
+
+def servers_and_characters_api(**args):
+ self,domain,user=gdmuld(args,"self","domain","user")
+ if not user: jhtmle(self,"No User"); return
+
+ user_data=get_user_data(user) #no need for async, as get_user prefetches the data
+
+ characters_data=get_characters(user)
+ characters=characters_to_client(characters_data)
+
+ servers_data=get_servers()
+ servers=servers_to_client(domain,servers_data)
+
+ mail=gf(user_data,"mail",0)
+
+ logging.info("servers_and_characters")
+ jhtml(self,[{"type":"servers_and_characters","servers":servers,"characters":characters,"tutorial":data_to_tutorial(user_data),"code_list":gf(user_data,"code_list",{}),"mail":mail,"rewards":gf(user,"rewards",[])}])
+
+def save_code_api(**args):
+ self,domain,user,code,slot,name,log,auto,electron=gdmuld(args,"self","domain","user","code","slot","name","log","auto","electron")
+ if not user: return
+ to_delete=False; old_name=name; character=None
+ data=get_user_data(user)
+ if not gf(data,"code_list"): data.info.code_list={}
+ if not code: code=""
+ if not slot:
+ jhtmle(self,"CODE save operation failed. No slot provided")
+ try:
+ slot=int(slot); found=False
+ for c in gf(user,"characters",[]):
+ if int(c["id"])==slot:
+ found=True
+ character=c["name"]
+ if data.info.code_list.get(slot) and name=="DELETE": found=True
+ if not found: slot=max(1,min(100,slot))
+ except:
+ return jhtmle(self,"Slot needs to be a number")
+ if not name: name=data.info.code_list.get(slot,[None])[0]
+ if not name: name="%s"%(character or slot)
+ old_name=data.info.code_list.get(slot,[name])[0]
+ name=to_filename(name)[:100] #without this, one could duplicate items [23/10/18]
+ #if slot>2 and not gf(user,"code_unlocked"): jhtmlc(self,"An 'Ancient Computer' unlocks code slots 3 to 100. You can freely use slots 1 and 2.","#3386CF"); return
+ try:
+ def save_transaction():
+ idata=get_user_data(user)
+ if not gf(idata,"code_list"): idata.info.code_list={}
+ if name=="DELETE":
+ try:
+ del idata.info.code_list[slot]
+ ndb.Key(InfoElement,"USERCODE-%s-%s"%(user.k(),slot)).delete()
+ except: pass
+ else:
+ InfoElement(key=ndb.Key(InfoElement,"USERCODE-%s-%s"%(user.k(),slot)),info=cGG(code=code)).put()
+ idata.info.code_list[slot]=[name,int(idata.info.code_list.get(slot,[None,0])[1])+1]
+ logging.info("Slot changed from %s to %s"%(idata.info.code_list.get(slot,None),name))
+ idata.put()
+ return idata
+ result=ndb.transaction(save_transaction,xg=True,retries=2)
+ if result: data=result
+ except:
+ log_trace()
+ return jhtmle(self,"CODE save operation failed. If your CODE is larger than 1MB, you need to shrink it, otherwise retry in a minute.")
+ if name=="DELETE":
+ jjson(self,{"type":"code_info","num":slot,"delete":True});
+ if not electron: jeval(self,"code_slot=0;code_change=false;")
+ if log: jhtmlc(self,"Deleted %s.%s.js"%(old_name,slot),"gray")
+ else: jhtmlchat(self,"Deleted %s.%s.js"%(old_name,slot),"gray")
+ else:
+ jjson(self,{"type":"code_info","num":slot,"name":data.info.code_list[slot][0],"v":data.info.code_list[slot][1]});
+ if not electron: jeval(self,"code_slot=%s;code_change=false;"%(slot))
+ if log: jhtmlc(self,"Saved %s.%s.js"%(name,slot),"#E13758")
+ elif auto and character: jhtmlc(self,"Auto-saved [%s]"%(character),"#96E8A7")
+ elif auto: jhtmlc(self,"Auto-saved %s.%s.js"%(name,slot),"#96E8A7")
+ else: jhtmlchat(self,"Saved %s.%s.js"%(name,slot),"#E13758")
+
+def load_code_api(**args):
+ self,domain,user,name,run,log,pure,save=gdmuld(args,"self","domain","user","name","run","log","pure","save")
+ name=to_filename("%s"%name)
+ if not user: return
+ data=get_user_data(user)
+ if name in [0,"0"]:
+ if pure: return shtml("htmls/contents/codes/default_code.js")
+ jjson(self,{"type":"code","code":shtml("htmls/contents/codes/default_code.js"),"run":run,"slot":0,"save":save});
+ if save: jhtml(self)
+ elif log: jhtmlc(self,"Loaded the default code","#32A3B0")
+ else: jhtmlchat(self,"Loaded the default code","#32A3B0")
+ return
+ for slot in gf(data,"code_list",{}):
+ if str(slot)=="%s"%name or ("%s"%data.info.code_list[slot][0]).lower()==("%s"%name).lower():
+ code=ndb.Key(InfoElement,"USERCODE-%s-%s"%(user.k(),slot)).get()
+ if code:
+ if pure: return code.info.code
+ jjson(self,{"type":"code","code":code.info.code,"run":run,"slot":slot,"save":save,"name":data.info.code_list[slot][0],"v":data.info.code_list[slot][1]});
+ if save: jhtml(self)
+ elif log: jhtmlc(self,"Loaded %s.%s.js"%(data.info.code_list[slot][0],slot),"#32A3B0")
+ else: jhtmlchat(self,"Loaded %s.%s.js"%(data.info.code_list[slot][0],slot),"#32A3B0")
+ return
+ if pure: return "say('Code not found'); set_status('Not Found')"
+ jhtmlchat(self,"Not Found","#AD3844")
+
+def load_libraries_api(**args):
+ self,domain,user=gdmuld(args,"self","domain","user")
+ jjson(self,{
+ "type":"libraries",
+ "default_code":shtml("htmls/contents/codes/default_code.js"),
+ "runner_functions":shtml("htmls/contents/codes/runner_functions.js"),
+ "runner_compat":shtml("htmls/contents/codes/runner_compat.js"),
+ "common_functions":shtml("htmls/contents/codes/common_functions.js")
+ });
+ jhtml(self)
+
+def tutorial_api(**args):
+ self,domain,user,task,step=gdmuld(args,"self","domain","user","task","step")
+ def data_transaction():
+ data=get_user_data(user)
+ if task:
+ if task in docs["tasks"] and task not in data.info.completed_tasks:
+ data.info.completed_tasks.append(task)
+ data.put()
+ return ["Task '%s' Complete!"%docs["tasks"][task],"#85C76B",data,1]
+ else:
+ if task in docs["tasks"]: return ["Task '%s' Complete!"%docs["tasks"][task],"gray",data,1]
+ else: return ["Invalid task '%s'"%task,"gray",data,0]
+ else:
+ data.info.tutorial_step=int(step)
+ data.put()
+ return ["Lesson '%s' Complete!"%docs["tutorial"][int(step)-1]["title"],"#85C76B",data,2]
+ result=ndb.transaction(data_transaction,xg=True,retries=2)
+ if result:
+ info=data_to_tutorial(result[2]);
+ info["type"]="tutorial_data"
+ if result[3]==1: info["success"]=True
+ if result[3]==2: info["next"]=True
+ jjson(self,info)
+ jhtmlc(self,result[0],result[1])
+ else:
+ jhtmle(self,"Failed")
+
+def reset_tutorial_api(**args):
+ self,domain,user,task,step=gdmuld(args,"self","domain","user","task","step")
+ def data_transaction():
+ return reset_tutorial(user)
+ result=ndb.transaction(data_transaction,xg=True,retries=2)
+ if result:
+ info=data_to_tutorial(result)
+ info["type"]="tutorial_data"
+ jjson(self,info)
+ jhtmlc(self,"Tutorial Reset!","#F7B32F")
+ else:
+ jhtmle(self,"Failed")
+
+def load_map_api(**args):
+ self,domain,user,key=gdmuld(args,"self","domain","user","key")
+ map=get_by_iid("map|%s"%key)
+ if not map or not gf(map,"resort"): jhtmlc(self,"Deck not found","#AE384D")
+ jjson(self,{"type":"map","data":map.info.data,"run":run})
+ jhtml(self)
+
+def load_article_api(**args):
+ #logging.info(col)
+ self,domain,user,name,func,tutorial,guide,url=gdmuld(args,"self","domain","user","name","func","tutorial","guide","url")
+ if tutorial: jjson(self,{"type":"article","html":shtml("docs/tutorial/%s.html"%name),"tutorial":tutorial,"url":url})
+ elif guide:
+ from docs.directory import docs
+ col=[]; prev=None; next=None; found=False
+ def traverse(entry):
+ if type(entry[0])==type([]):
+ for e in entry:
+ traverse(e)
+ else:
+ if len(entry)==5 and entry[4]:
+ traverse(entry[4])
+ else:
+ col.append(entry[0])
+ traverse(docs["guide"])
+ #logging.info(col)
+ for i in xrange(0,len(col)):
+ if col[i]==name:
+ found=True
+ if i+1!=len(col): next=col[i+1]
+ break
+ prev=col[i]
+ #logging.info([prev,next])
+ try: jjson(self,{"type":"article","html":shtml("docs/guide/%s.html"%name),"guide":guide,"url":url,"prev":found and prev,"next":found and next})
+ except: jjson(self,{"type":"article","html":shtml("docs/articles/%s.html"%name),"url":url,"prev":found and prev,"next":found and next})
+ elif func: jjson(self,{"type":"article","html":shtml("docs/functions/%s.html"%name),"func":name,"url":url})
+ else: jjson(self,{"type":"article","html":shtml("docs/articles/%s.html"%name),"url":url})
+ jhtml(self)
+
+def load_gcode_api(**args):
+ self,domain,user,file,run=gdmuld(args,"self","domain","user","file","run")
+ if run: jjson(self,{"type":"code","code":shtml("docs%s"%file),"run":True})
+ else: jjson(self,{"type":"gcode","code":shtml("docs%s"%file)})
+ jhtml(self)
+
+def list_codes_api(**args):
+ self,domain,user,purpose=gdmuld(args,"self","domain","user","purpose")
+ if not user: return
+ data=get_user_data(user)
+ jhtml(self,[{"type":"code_list","purpose":purpose,"list":gf(data,"code_list",{})}])
+
+def can_create_character(self,user):
+ ip=get_ip_info(self)
+ if user.pid: user.info.slots=max(gf(user,"slots",8),8)
+ if gf(ip,"limit_create_character",0)>12: return False,"ip"
+ if len(gf(user,"characters",[]))>=18: return False,"abs"
+ if len(gf(user,"characters",[]))>=gf(user,"slots",5):
+ if user.cash>=200: return True,True
+ return False,"limit"
+ return True,True
+
+def is_name_allowed(name):
+ try:
+ if int(name): return False
+ except: pass
+ for c in name:
+ if c not in allowed_name_characters:
+ return False
+ if len(name)<4: return False
+ if len(name)>12: return False
+ return True
+
+def create_character_api(**args):
+ self,domain,user,name,char,look=gdmuld(args,"self","domain","user","name","char","look")
+ if char not in character_types: jhtmle(self,"Character type not allowed"); return
+ if len(classes[char]["looks"])<=int(look): jhtmle(self,"Invalid look"); return
+ #if gender not in gender_types: jhtmle(self,"Gender unknown"); return
+ if not name: jhtmle(self,"Please enter a name"); return
+ name=name.replace(" ","").replace("\t","")
+ if not is_name_allowed(name): jhtmle(self,"Invalid character name, may be too short, too long, or include invalid characters"); return
+ if get_character(name,phrase_check=True): jhtmlm(self,"%s is used"%name); return
+ if user.server: return jhtmle(self,"Can't make changes while inside the bank")
+ creatable,reason=can_create_character(self,user)
+ if not creatable:
+ if reason=="ip": jhtmle(self,"Too many characters from this IP. Please wait a couple hours or use a non-public network"); return
+ if reason=="abs": jhtmle(self,"You can't create more than 18 characters"); return
+ jhtmlm(self,"You've reached the current limit of free characters. You can freely create 5 characters. Delete a character you don't want to use. Recreate another character."); return
+ characterth=get_characterth()
+ def new_character_transaction():
+ markedphrase=get_by_iid("markedphrase|%s"%dgt("character",simplify_name(name)))
+ owner=get_by_iid(user.k('i'))
+ if markedphrase: return False
+ base=classes[char]
+ character=Character(name=simplify_name(name),owner=user.k(),type=char,referrer=owner.referrer,info=GG())
+ character.info.characterth=characterth
+ character.info.name=name
+ character.info.gold=0
+ character.info.items=[{"name":"hpot0","q":200,"gift":1},{"name":"mpot0","q":200,"gift":1}]
+ character.info.slots=copy.deepcopy(base["base_slots"])
+ if 1:
+ character.info.slots["helmet"]={"name":"helmet","level":0,"gift":1}
+ character.info.slots["shoes"]={"name":"shoes","level":0,"gift":1}
+ character.info.stats={}
+ #character.info.gender=gender
+ character.info.skin=base["looks"][look][0]
+ character.info.cx=base["looks"][look][1]
+ character.info.map="main"
+ setattr(character.info,"in","main")
+ character.info.x,character.info.y=maps["main"]["spawns"][maps["main"].get("on_death",["main",0])[1]]
+ character.put()
+ if not len(owner.info.characters): owner.name=name
+ if len(owner.info.characters)>=gf(owner,"slots",5):
+ owner.info.slots=gf(owner,"slots",5)+1
+ owner.cash-=200
+ owner.info.characters.append(character_to_dict(character))
+ if not owner.name or owner.name.startswith("#"): owner.name=name
+ if not gf(owner,"server_data"):
+ logging.info("created Player for %s"%owner.k())
+
+ owner.put()
+ mark_phrase(character,"character",simplify_name(name))
+ return character,owner
+ character=ndb.transaction(new_character_transaction,xg=True,retries=12)
+ if not character: jhtmle(self,"Creation Failed"); return
+ character,owner=character
+ try:
+ ip=get_ip_info(self)
+ ip.info.limit_create_character=gf(ip,"limit_create_character",0)+1
+ put_ip_info(ip,user=user,character=character)
+ except:
+ log_trace()
+ jhtml(self,[
+ {"type":"success","message":"%s is alive!"%name },
+ selection_info(self,owner,domain),
+ ])
+ add_event(owner,"new_character",["characters","noteworthy"],self=self,info=cGG(message="New Character %s from %s"%(character.info.name,user.info.email)),backup=True,async=True)
+ increase_characterth()
+
+def sort_characters_api(**args):
+ self,domain,user,l=gdmuld(args,"self","domain","user","characters")
+ if not user: return
+ rest=Character.query(Character.owner==user.k()).fetch(100)
+ characters=[]
+ for name in ("%s"%l).split(","):
+ for c in rest:
+ if simplify_name(name)==simplify_name(c.name):
+ characters.append(c)
+ rest.remove(c)
+ break
+ characters.extend(rest)
+ # for c in characters:
+ # logging.info(c.name)
+ # jhtmls(self,"OK")
+ def sort_transaction():
+ owner=get_by_iid(user.k('i')); first=False; firstp=False
+ owner.info.characters=[]
+ for c in characters:
+ if not first: owner.name=c.info.name; first=True
+ if not firstp and not c.private: owner.name=c.info.name; firstp=True
+ owner.info.characters.append(character_to_dict(c))
+ owner.info.transfer_auth=randomStr(10)
+ owner.put()
+ return owner
+ result=ndb.transaction(sort_transaction,xg=True,retries=1)
+ if result:
+ jhtml(self,[
+ {"type":"message","message":"Done!"},
+ selection_info(self,result,domain),
+ ])
+ else:
+ jhtmlm(self,"Something went wrong")
+
+def is_name_xallowed(name):
+ try:
+ if int(name): return False
+ except: pass
+ for c in name:
+ if c not in allowed_name_characters:
+ return False
+ if len(name)<1: return False
+ if len(name)>12: return False
+ return True
+
+def quote_name_api(**args):
+ self,domain,user,name,nname=gdmuld(args,"self","domain","user","name","nname")
+
+ if not nname or not is_name_xallowed(nname): return jhtmle(self,"Invalid name")
+ if get_character(nname,phrase_check=True): return jhtmle(self,"%s is used"%nname)
+
+ character=get_character(name)
+
+ price=400
+ if len(nname)==1: price=160000
+ elif len(nname)==2: price=48000
+ elif len(nname)==3: price=24000
+ elif len(nname)==4: price=2400
+ else:
+ if character and not gf(character,"last_rename",None) and (character.level<60 or hsince(character.created)<72): price=0
+ price=640
+ jeval(self,"show_alert('Costs %s shells')"%to_pretty_num(price)); jhtml(self)
+
+def rename_character_api(**args):
+ self,domain,user,name,nname=gdmuld(args,"self","domain","user","name","nname")
+
+ character=get_character(name)
+ if not character: return jhtmle(self,"No character with that name.")
+ if character.owner!=user.k(): return jhtmle(self,"You don't own that character.")
+ if is_in_game(character): return jhtmle(self,"Character is in game.")
+ if hsince(gf(character,"last_rename",really_old))<32: return jhtmle(self,"You can rename once every 32 hours!")
+
+ if not nname or not is_name_xallowed(nname): return jhtmle(self,"Invalid name")
+ if get_character(nname,phrase_check=True): return jhtmle(self,"%s is used"%nname)
+
+ if user.server: return jhtmle(self,"Can't make changes while inside the bank")
+
+ price=400
+ if len(nname)==1: price=160000
+ elif len(nname)==2: price=48000
+ elif len(nname)==3: price=24000
+ elif len(nname)==4: price=2400
+ else:
+ if not gf(character,"last_rename",None) and (character.level<60 or hsince(character.created)<72): price=0
+ price=640
+
+ if user.cash
"%((i+1),xp,xp/200.0,xp/40000.0))
+# skill=1; level=i+1
+# if level>=80: skill=4
+# elif level>=60: skill=3
+# elif level>=40: skill=2
+# levels[i+1]={"xp":xp,"point":skill}
+# xp*=1.25
+# json_output=levels
+
+#NEW ONE:
+
+# xp=200
+# levels={}
+# if 1:
+# if 1:
+# if 1:
+# for i in xrange(200):
+# new_xp=xp
+# while new_xp>=100: new_xp/=10
+# new_xp=int(new_xp)
+# while new_xp*10<=xp: new_xp*=10
+# xp=new_xp
+# self.response.out.write("level %s %sxp %s worms %s 40K's
"%((i+1),to_pretty_num(xp),xp/200.0,xp/40000.0))
+# level=i+1
+# levels[i+1]=xp
+# if level<60: xp*=1.25
+# elif level<80: xp*=1.2
+# elif level<100: xp*=1.1
+# else: xp*=1.08
+# json_output=levels
+
+#NEW NEW ONE: [07/10/16]
+# xp=200
+# levels={}
+# if 1:
+# if 1:
+# if 1:
+# for i in xrange(200):
+# new_xp=xp
+# while new_xp>=100: new_xp/=10
+# new_xp=int(new_xp)
+# while new_xp*10<=xp: new_xp*=10
+# xp=new_xp
+# self.response.out.write("level %s %sxp %s worms %s 40K's
"%((i+1),to_pretty_num(xp),xp/200.0,xp/40000.0))
+# level=i+1
+# levels[i+1]=xp
+# if level<60: xp*=1.25
+# elif level<75: xp*=1.225
+# elif level<80: xp*=1.2
+# elif level<90: xp*=1.275
+# elif level<100: xp*=1.375
+# else: xp*=1.1
+# json_output=levels
+
+levels={
+ "1": 200,
+ "2": 250,
+ "3": 310,
+ "4": 380,
+ "5": 470,
+ "6": 580,
+ "7": 720,
+ "8": 900,
+ "9": 1100,
+ "10": 1300,
+ "11": 1600,
+ "12": 2000,
+ "13": 2500,
+ "14": 3100,
+ "15": 3800,
+ "16": 4700,
+ "17": 5800,
+ "18": 7200,
+ "19": 9000,
+ "20": 11000,
+ "21": 13000,
+ "22": 16000,
+ "23": 20000,
+ "24": 25000,
+ "25": 31000,
+ "26": 38000,
+ "27": 47000,
+ "28": 58000,
+ "29": 72000,
+ "30": 90000,
+ "31": 110000,
+ "32": 130000,
+ "33": 160000,
+ "34": 200000,
+ "35": 250000,
+ "36": 310000,
+ "37": 380000,
+ "38": 470000,
+ "39": 580000,
+ "40": 720000,
+ "41": 900000,
+ "42": 1100000,
+ "43": 1300000,
+ "44": 1600000,
+ "45": 2000000,
+ "46": 2500000,
+ "47": 3100000,
+ "48": 3800000,
+ "49": 4700000,
+ "50": 5800000,
+ "51": 7200000,
+ "52": 9000000,
+ "53": 11000000,
+ "54": 13000000,
+ "55": 16000000,
+ "56": 20000000,
+ "57": 25000000,
+ "58": 31000000,
+ "59": 38000000,
+ "60": 47000000,
+ "61": 57000000,
+ "62": 69000000,
+ "63": 84000000,
+ "64": 100000000,
+ "65": 120000000,
+ "66": 140000000,
+ "67": 170000000,
+ "68": 200000000,
+ "69": 240000000,
+ "70": 290000000,
+ "71": 350000000,
+ "72": 420000000,
+ "73": 510000000,
+ "74": 620000000,
+ "75": 750000000,
+ "76": 900000000,
+ "77": 1000000000,
+ "78": 1200000000,
+ "79": 1400000000,
+ "80": 1600000000,
+ "81": 2000000000,
+ "82": 2500000000,
+ "83": 3100000000,
+ "84": 3900000000,
+ "85": 4900000000,
+ "86": 6200000000,
+ "87": 7900000000,
+ "88": 10000000000,
+ "89": 12000000000,
+ "90": 15000000000,
+ "91": 20000000000,
+ "92": 27000000000,
+ "93": 37000000000,
+ "94": 50000000000,
+ "95": 68000000000,
+ "96": 93000000000,
+ "97": 120000000000,
+ "98": 160000000000,
+ "99": 220000000000,
+ "100": 300000000000,
+ "101": 330000000000,
+ "102": 360000000000,
+ "103": 390000000000,
+ "104": 420000000000,
+ "105": 460000000000,
+ "106": 500000000000,
+ "107": 550000000000,
+ "108": 600000000000,
+ "109": 660000000000,
+ "110": 720000000000,
+ "111": 790000000000,
+ "112": 860000000000,
+ "113": 940000000000,
+ "114": 1000000000000,
+ "115": 1100000000000,
+ "116": 1200000000000,
+ "117": 1300000000000,
+ "118": 1400000000000,
+ "119": 1500000000000,
+ "120": 1600000000000,
+ "121": 1700000000000,
+ "122": 1800000000000,
+ "123": 1900000000000,
+ "124": 2000000000000,
+ "125": 2200000000000,
+ "126": 2400000000000,
+ "127": 2600000000000,
+ "128": 2800000000000,
+ "129": 3000000000000,
+ "130": 3300000000000,
+ "131": 3600000000000,
+ "132": 3900000000000,
+ "133": 4200000000000,
+ "134": 4600000000000,
+ "135": 5000000000000,
+ "136": 5500000000000,
+ "137": 6000000000000,
+ "138": 6600000000000,
+ "139": 7200000000000,
+ "140": 7900000000000,
+ "141": 8600000000000,
+ "142": 9400000000000,
+ "143": 10000000000000,
+ "144": 11000000000000,
+ "145": 12000000000000,
+ "146": 13000000000000,
+ "147": 14000000000000,
+ "148": 15000000000000,
+ "149": 16000000000000,
+ "150": 17000000000000,
+ "151": 18000000000000,
+ "152": 19000000000000,
+ "153": 20000000000000,
+ "154": 22000000000000,
+ "155": 24000000000000,
+ "156": 26000000000000,
+ "157": 28000000000000,
+ "158": 30000000000000,
+ "159": 33000000000000,
+ "160": 36000000000000,
+ "161": 39000000000000,
+ "162": 42000000000000,
+ "163": 46000000000000,
+ "164": 50000000000000,
+ "165": 55000000000000,
+ "166": 60000000000000,
+ "167": 66000000000000,
+ "168": 72000000000000,
+ "169": 79000000000000,
+ "170": 86000000000000,
+ "171": 94000000000000,
+ "172": 100000000000000,
+ "173": 110000000000000,
+ "174": 120000000000000,
+ "175": 130000000000000,
+ "176": 140000000000000,
+ "177": 150000000000000,
+ "178": 160000000000000,
+ "179": 170000000000000,
+ "180": 180000000000000,
+ "181": 190000000000000,
+ "182": 200000000000000,
+ "183": 220000000000000,
+ "184": 240000000000000,
+ "185": 260000000000000,
+ "186": 280000000000000,
+ "187": 300000000000000,
+ "188": 330000000000000,
+ "189": 360000000000000,
+ "190": 390000000000000,
+ "191": 420000000000000,
+ "192": 460000000000000,
+ "193": 500000000000000,
+ "194": 550000000000000,
+ "195": 600000000000000,
+ "196": 660000000000000,
+ "197": 720000000000000,
+ "198": 790000000000000,
+ "199": 860000000000000,
+ "200": 940000000000000
+}
\ No newline at end of file
diff --git a/design/maps.py b/design/maps.py
new file mode 100644
index 0000000..94f9466
--- /dev/null
+++ b/design/maps.py
@@ -0,0 +1,1640 @@
+# 0 front, 1 left, 2 right, 3 back
+
+#main7 - copy of the long-used production map [27/08/16]
+#new_main2+new_main3 - floating shrine prototype
+#main8 - main7 with castle + small path/island removed
+
+maps={
+ "old_main":{
+ "key":"main5",
+ "name":"Old Town",
+ "npcs":
+ [
+ {"name":"Pots","id":"pots","position":[10,10]},
+ {"name":"Come Scroll Away","id":"scrolls","position":[112,-152]},
+ {"name":"Shrine of Gods","id":"shrine","position":[4,-155]},
+ {"name":"Shrine of Combinations","id":"compound","position":[46,-155]},
+ {"name":"Armorz","id":"armors","position":[-20,10]},
+ {"name":"Weaponz","id":"weapons","position":[40,10]},
+ {"name":"Transporter","id":"transporter","position":[180,-210]},
+ ],
+ "monsters":[
+ {"type":"goo","position":[-400,0],"radius":220,"count":10},
+ {"type":"spider","position":[-300,100],"radius":180,"count":6},
+ {"type":"scorpion","position":[-100,100],"radius":180,"count":12},
+ {"type":"bat","position":[200,100],"radius":180,"count":5},
+ {"type":"dknight2","position":[300,-100],"radius":160,"count":4},
+ {"type":"phoenix","position":[0,0],"radius":1200,"count":1},
+ ],
+ "spawns":[[100,100]],
+ "ignore":True,
+ },
+ "original_main":{
+ "ignore":True,
+ "key":"main",
+ "name":"Town",
+ "npcs":[
+ {"name":"Shrine of Gods","id":"shrine","position":[319,-178]}, #0 - server.js
+ {"name":"Shrine of Combinations","id":"compound","position":[362,-178]}, #1 - server.js
+
+ {"name":"Pots","id":"pots","position":[112,40]},
+
+ #{"name":"Transporter","id":"transporter","position":[163,-197]},
+ {"name":"Exchanger","id":"exchange","position":[163,-197]},
+ {"name":"Come Scroll Away","id":"scrolls","position":[241,-215]},
+
+ {"name":"Armorz","id":"armors","position":[-106,-211]},
+ {"name":"Weaponz","id":"weapons","position":[61,-220]},
+ #{"name":"Ship","id":"ship","position":[832,119]},
+
+ # {"name":"Firstc","id":"firstc","position":[-106,-180]},
+
+ {"name":"Lich","id":"lichteaser","position":[1352,64]},
+
+ {"name":"Zen Girl","id":"appearance","position":[792,800]},
+
+ {"id":"pvp","positions":[ [-375,-104],[-482,-10,2] ]}, #currently the direction is hard-coded at update_sprite [30/08/16]
+
+ {"name":"Transporter","id":"transporter","position":[409,36]},
+ ],
+ "old_monsters":[
+ {"type":"goo","boundary":[-84,95,255,234],"count":12},
+ #{"type":"pinkgoo","boundary":[-84,95,255,234],"count":1},
+ #{"type":"goblin","boundary":[-84,95,255,234],"count":1},
+ {"type":"squig","boundary":[279,201,718,333],"count":7},
+ {"type":"bee","boundary":[464,37,744,190],"count":10},
+
+ {"type":"armadillo","boundary":[-20,295,221,529],"count":6},
+ {"type":"squigtoad","boundary":[50,473,534,676],"count":4},
+ {"type":"bee","boundary":[440,377,752,567],"count":10},
+
+ {"type":"spider","boundary":[1045,423,1371,713],"count":9},
+ {"type":"scorpion","boundary":[997,733,1374,911],"count":9},
+ #{"type":"dknight2","boundary":[820,165,1375,465],"count":6},
+ {"type":"croc","boundary":[820,165,1375,465],"count":6},
+
+ #{"type":"greenfairy","boundary":[690,745,895,850],"count":1},
+ {"type":"greenfairy","boundary":[690,745,895,775],"count":1},
+ {"type":"redfairy","boundary":[690,745,742,850],"count":1},
+ {"type":"bluefairy","boundary":[840,745,895,850],"count":1},
+
+ #{"type":"phoenix","boundaries":[["main",1042,155,1375,912],["main",820,160,1378,466],["batcave",-210,-170,342,185]],"count":1,"stype":"randomrespawn"},
+ ],
+ "spawns":[
+ [41,-71], #0-town
+ [-271,-9,0], #1-cave exit
+ [-376,-99,0], #2-arena exit
+ [-460,63,2], #3-pvp death
+ [224,48], #4-main death
+ [600,-42],#5-bank-exit
+ [408,62,3],#6-front of the transporter
+ ],
+ "on_death":["original_main",4],
+ "doors":[
+ [-273,-25,24,30,"batcave",0,1],
+ [-374,-113,24,30,"arena",0,2],
+ [600,-69,32,40,"bank",0,5],
+ ],
+ "quirks":[
+ [664,-55,20,16,"sign","An Offshore Bank"],
+ ],
+ "pvp":False,
+ "drop_norm":700,
+ "instance":True,
+ },
+ "test":{
+ "key":"test_large",
+ "key":"resort_default",
+ "key":"jayson_PirateShip0",
+ "key":"test",
+ "name":"Test",
+ "npcs":[
+ {"name":"Transporter","id":"transporter","position":[-50,-50]},
+ ],
+ "monsters":[],
+ "spawns":[[0,0]],
+ "no_bounds":True,
+ "irregular":True,
+ "day":True,
+ },
+ "crypt":{
+ "key":"jayson_instance_dungeon1",
+ "name":"The Crypt [Cave]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"a1","boundary":[2243.92,325.27,2689.64,505.06],"count":1},
+ {"type":"a7","boundary":[726.81,-1076.19,726.81,-1076.19],"count":1,"roam":True},
+ {"type":"a3","boundary":[1790.79,-1480.39,1790.79,-1480.39],"count":1,"roam":True},
+ {"type":"a6","boundary":[2746.91,-1734.86,2746.91,-1734.86],"count":1,"roam":True},
+ {"type":"a5","boundary":[2736.38,-1090.91,2736.38,-1090.91],"count":1,"roam":True},
+ {"type":"a2","boundary":[1109.81,-632.68,1109.81,-632.68],"count":1,"roam":True},
+ {"type":"a4","boundary":[2745.11,-655.82,2745.11,-655.82],"count":1,"roam":True},
+ {"type":"a8","boundary":[2042.91,-883.27,2042.91,-883.27],"count":1,"roam":True},
+ {"type":"vbat","boundary":[903.57,-465.05,1479.2,-304.03],"count":7},
+ ],
+ "spawns":[
+ [0,0],
+ ],
+ "on_death":["cave",2],
+ "on_exit":["cave",2],
+ "doors":[
+ [-1.54,105.6,126.56,56.96,"cave",2,0],
+ ],
+ "instance":True,
+ },
+ "goobrawl":{
+ "key":"jayson_GooIsland",
+ "name":"Goo Brawl!",
+ "npcs":[
+ {"id":"transporter","position":[-347,-483]},
+ ],
+ "monsters":[
+ {"type":"rgoo","boundary":[-432,-472,448,208],"count":0,"polygon":[[-344,192],[-288,192],[-288,208],[184,208],[376,208],[376,184],[416,184],[416,-96],[448,-96],[448,-240],[400,-240],[400,-344],[288,-344],[288,-264],[264,-264],[264,-240],[232,-240],[232,-184],[200,-184],[200,-152],[16,-152],[16,-128],[-128,-128],[-128,-168],[-192,-168],[-192,-216],[-248,-216],[-248,-240],[-288,-240],[-288,-408],[-320,-408],[-320,-472],[-408,-472],[-408,-416],[-432,-416],[-432,-112],[-400,-112],[-400,136],[-384,136],[-384,168],[-344,168]]},
+ ],
+ "spawns":[
+ [0,0],
+ ],
+ "event":"goobrawl",
+ "code":"join('goobrawl')",
+ "on_death":["goobrawl",0],
+ "doors":[
+ ],
+ "outside":True,
+ #"instance":True,
+ },
+ "abtesting":{
+ "key":"jayson_vs_arena",
+ "name":"A/B Testing",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [0,0],
+ [0,-232],
+ [-832,0,2,160], #scatter 100
+ [832,0,1,160],
+ ],
+ "on_death":["abtesting",1],
+ "doors":[
+ ],
+ "event":"abtesting",
+ "code":"join('abtesting')",
+ "pvp":True,
+ "instance":True,
+ "lux":0.8,
+ },
+ "dungeon0":{
+ "key":"dungeon0",
+ "name":"Dungeon",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"goo","boundary":[-50,-50,50,50],"count":5},
+ ],
+ "spawns":[
+ [0,0],
+ ],
+ "on_death":["dungeon0",0],
+ "doors":[
+ ],
+ "pvp":True,
+ "no_bounds":True,
+ "instance":True,
+ "lux":0.7,
+ },
+ "cgallery":{
+ "key":"cgallery",
+ "name":"Cosmetics Gallery",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [0,0],
+ ],
+ "doors":[
+ ],
+ "pvp":True,
+ "no_bounds":True,
+ "instance":True,
+ "lux":1,
+ },
+ "old_bank":{
+ "key":"bank0",
+ "name":"The Bank",
+ "npcs":[
+ {"id":"goldnpc","position":[57,0]},
+ {"id":"items0","position":[-24,49]}, #can be 48 too
+ {"id":"items1","position":[128,49]},
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [56,129,3],
+ ],
+ "doors":[
+ [56,187,64,40,"main",5,0],
+ ],
+ "quirks":[
+ [56,-52,16,34,"log","It's time."],
+ ],
+ "mount":True,
+ "ignore":True,
+ },
+ "bank":{
+ "key":"jayson_bank",
+ "key":"jayson_bank0",
+ #"key":"jayson_bank_xmas",
+ #"key":"jayson_bank0.Xmas", #xmas
+ "name":"The Bank",
+ "npcs":[
+ {"id":"goldnpc","position":[1,-416]},
+ {"id":"items4","position":[-64,-415]},
+ {"id":"items5","position":[64,-415]},
+ {"id":"items6","position":[-128,-415]},
+ {"id":"items7","position":[128,-415]},
+ #bottom row
+ {"id":"items0","position":[-64,-191]}, #can be 48 too
+ {"id":"items1","position":[64,-191]},
+ {"id":"items2","position":[-128,-191]},
+ {"id":"items3","position":[128,-191]},
+ {"id":"rewards","position":[155,-105,1]},
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [0,-37,3],
+ [0.75,-435.79],
+ ],
+ "doors":[
+ [0,-8,40,20,"main",3,0],
+ [0.13,-444.39,34.3,52.27,"bank_b",0,1,"ulocked"],
+ ],
+ "quirks":[
+ [-40.34,-448.85,26.77,42.69,"log","It's time."],
+ ],
+ "on_exit":["main",3],
+ "mount":True,
+ "safe":True,
+ "lux":0.8,
+ #"ignore":True,
+ },
+ "bank_b":{
+ "key":"jayson_theBank1",
+ "name":"The Bank [Basement]",
+ "npcs":[
+ {"id":"items8","position":[-592.5,-300]},
+ {"id":"items9","position":[-528,-318]},
+ {"id":"items10","position":[-464,-333]},
+ {"id":"items11","position":[-400.5,-350]},
+
+ {"id":"items12","position":[-128.5,-429.5]},
+ {"id":"items13","position":[-64.5,-413.5]},
+ {"id":"items14","position":[-0.5,-398]},
+ {"id":"items15","position":[63,-381.5]},
+
+ {"id":"items16","position":[-480.5,50]},
+ {"id":"items17","position":[-416.5,65.5]},
+ {"id":"items18","position":[-352.5,81.5]},
+ {"id":"items19","position":[-288.5,97.5]},
+
+ {"id":"items20","position":[-16.5,-14]},
+ {"id":"items21","position":[47.5,-14]},
+ {"id":"items22","position":[111,-14]},
+ {"id":"items23","position":[175,-14]},
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [-264.38,-411.81],
+ [-103.51,-170.63],
+ ],
+ "doors":[
+ [-264.04,-421.14,66.84,65.15,"bank",1,0],
+ [-104.49,-179.73,32.05,45.25,"bank_u",1,1,"ulocked"],
+ ],
+ "quirks":[
+ ],
+ "on_exit":["main",3],
+ "lux":0.7,
+ "mount":True,
+ "safe":True,
+ },
+ "bank_u":{
+ "key":"jayson_theBank2",
+ "name":"The Bank [Underground]",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [-479.47,-25.02],
+ [-0.4,-41.24],
+ ],
+ "doors":[
+ [-479.82,-36.54,31,49.64,"level2",6,0,"ulocked","complicated"],
+ [0.22,-50.06,64.89,63.09,"bank_b",1,1,"ulocked"]
+ ],
+ "quirks":[
+ ],
+ "on_exit":["level2",6],
+ "mount":True,
+ "safe":True,
+ "lux":0.6,
+ },
+ "ship0":{
+ "key":"jayson_PirateShip0",
+ "name":"The Pirate Ship",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [0,0],
+ ],
+ "doors":[
+ ],
+ "quirks":[
+ ],
+ "event":"pirateship",
+ "outside":True,
+ },
+ "d2":{ #prototype
+ "key":"d2",
+ "name":"Dark World",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"d_wiz","boundary":[-49,-679,51,-640],"count":1,"gatekeeper":True,"rage":[-172,-685,219,-437]},
+ ],
+ "spawns":[
+ [0,-15],
+ [0,-671]
+ ],
+ "doors":[
+ [0,22,40,40,"d1",1,0],
+ [0,-684,20,50,"d3",0,1,"protected"],
+ ],
+ "quirks":[
+ ],
+ "ignore":True,
+ },
+ "d_e":{
+ "key":"jayson_pvpDungeonTest",
+ "key":"jayson_pvpDungeon_entrance",
+ "safe":True,
+ "fx":"storm",
+ "weather":"rain",
+ "name":"Dungeon [Entrance]",
+ "npcs":[
+ {"id":"transporter","position":[-9,0]},
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [-9.2,-0.91],
+ [0.08,-291.85],
+ ],
+ "doors":[
+ [-0.15,-299.63,35.39,51.17,"d_g",0,1],
+ ],
+ "quirks":[
+ ],
+ "world":"dungeon",
+ },
+ "d_g":{
+ "key":"jayson_pvpDungeon_gateway",
+ "name":"Dungeon [Gateway]",
+ "npcs":[
+ ],
+ "monsters":[
+ #{"type":"bat","boundary":[-120,-207,108,17],"count":6},
+ ],
+ "spawns":[
+ [0.03,1.13,3],
+ [-319.17,-102.09,3],
+ ],
+ "doors":[
+ [0.14,47.88,46.19,36.62,"d_e",1,0],
+ [-320.6,-39.93,64.22,59.29,"d_b1",0,1],
+ ],
+ "quirks":[
+ [-320.64,-213.45,67.59,82.61,"log","The passage is blocked"],
+ ],
+ "world":"dungeon",
+ },
+ "d_b1":{
+ "key":"jayson_pvpDungeon_b1",
+ "name":"Dungeon",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [-0.28,10.19,3],
+ [-192.16,-1655.63],
+ ],
+ "doors":[
+ [0.09,83.59,66.6,63.26,"d_g",1,0],
+ [-192.9,-1666.24,59.7,45.23,"d_a1",0,1],
+ ],
+ "quirks":[
+ [190.54,-1628.83,59.88,85.03,"log","The passage is blocked"],
+ ],
+ "world":"dungeon",
+ "traps":[
+ {"type":"debuff","polygon":[[-336,-1136],[-192,-1136],[-192,-1160],[-168,-1160],[-168,-1152],[-120,-1152],[-120,-1168],[-112,-1168],[-112,-1240],[-72,-1240],[-72,-1256],[-56,-1256],[-56,-1288],[0,-1288],[0,-1272],[16,-1272],[16,-1208],[88,-1208],[88,-1088],[200,-1088],[200,-1128],[336,-1128],[336,-1368],[240,-1368],[240,-1336],[216,-1336],[216,-1320],[160,-1320],[160,-1400],[128,-1400],[128,-1448],[144,-1448],[144,-1512],[88,-1512],[88,-1496],[64,-1496],[64,-1440],[40,-1440],[40,-1432],[0,-1432],[0,-1464],[-40,-1464],[-40,-1480],[-64,-1480],[-64,-1512],[-144,-1512],[-144,-1560],[-176,-1560],[-176,-1576],[-216,-1576],[-216,-1544],[-264,-1544],[-264,-1480],[-288,-1480],[-288,-1456],[-296,-1456],[-296,-1432],[-328,-1432],[-328,-1152],[-336,-1152]]},
+ ]
+ },
+ "d_a1":{
+ "key":"jayson_pvpDungeon_a1",
+ "name":"Dungeon",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [-2.2,1.48,3],
+ [255.6,-905.1],
+ ],
+ "doors":[
+ [0.21,79.75,54.39,66.5,"d_b1",1,0],
+ [254.82,-916.88,61.73,99.0,"d_a2",0,1],
+ ],
+ "quirks":[
+ ],
+ "world":"dungeon",
+ },
+ "d_a2":{
+ "key":"jayson_pvpDungeon_a2",
+ "name":"Dungeon",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [-2.12,-0.39,3]
+ ],
+ "doors":[
+ [0.6,77.16,56.2,64.21,"d_a1",1,0],
+ ],
+ "quirks":[
+ ],
+ "world":"dungeon",
+ },
+ "cave":{
+ "key":"jayson_cave02",
+ "name":"Cave of Darkness",
+ "npcs":[
+ #{"name":"Transporter","id":"transporter","position":[100,100]},
+ ],
+ "monsters":[
+ {"type":"bat","boundary":[-396,-594,8,-328],"count":6},
+ {"type":"bat","boundary":[182,-1282,465,-932],"count":7},
+ {"type":"bat","boundary":[1018,-940,1385,-624],"count":8},
+ {"type":"bat","boundary":[1066,-132,1420,78],"count":5},
+ {"type":"bat","boundary":[964,11,1252,107],"count":2},
+ {"type":"mvampire","boundaries":[["cave",-367,-1296,-14,-1057],["cave",1068,-123,1420,78]],"count":1,"stype":"randomrespawn"},
+ #{"type":"dknight2","boundary":[0,0,0,0],"count":1,"roam":True},
+ ],
+ "spawns":[
+ [0,0,3],
+ [1877,-1078], #1-level1
+ [-193.41,-1295.83], #2-crypt - HARD REFERENCED AT server.js
+ ], # 1 left, 2 right, 3 back
+ "doors":[
+ [0,33,36,20,"main",4,0], #.spawns[4]
+ [1880,-1086,32,32,"level1",3,1],
+ [-192.22,-1308.2,50.35,56.23,"crypt",0,2,"key","cryptkey"],
+ ],
+ "quirks":[
+ [-192,-1309,48,64,"log","Is this a gateway?"],
+ [-193.41,-1295.83,0,0,"info","crypt"],
+ ],
+ "drop_norm":4500,
+ "lux":0.45,
+ },
+ "mtunnel":{
+ "key":"jayson_mainlandTunnel",
+ "name":"Underground [Tunnel]",
+ "npcs":[
+ #{"name":"Transporter","id":"transporter","position":[100,100]},
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [0,8], #0-entrance
+ [671,-225,3], #1-main17
+ [1169,-55,3], #1-main18
+ ], # 1 left, 2 right, 3 back
+ "doors":[
+ [0,-3,24,60,"main",16,0], #main16
+ [656,-240,24,60,"main",17,1], #main17
+ [1168,-65,24,60,"main",18,2], #main18
+ ],
+ "quirks":[
+ ],
+ "drop_norm":4500,
+ "lux":0.6,
+ },
+ "main":{
+ "key":"jayson_ALMap2_v2",
+ #"key":"jayson_ALMap2_v2.Xmas",
+ #"key":"jayson_ALMap2_v2.CNewYear",
+ #"key":"jayson_ALMap2_v2_xmas", #xmas
+ #"key":"jayson_ALMap2_v2.lunarNewYear",
+ "name":"Mainland",
+ "npcs":[
+ #{"id":"newupgrade","position":[-203,-174]},
+ {"id":"newupgrade","position":[-207,-220]},
+ {"name":"Exchanger","id":"exchange","position":[-25,-478]},
+ {"name":"Come Scroll Away","id":"scrolls","position":[-464,-96]},
+ {"id":"lotterylady","position":[-341,168]},
+ {"id":"fisherman","position":[-1572,552,1]},
+ #{"id":"fancypots","position":[56,-169]},
+ {"id":"fancypots","position":[-35,-162]},
+ #{"id":"basics","position":[-56,-144]},
+ {"id":"basics","position":[-89,-165]},
+ {"id":"premium","position":[192,-564]},
+ #{"id":"tavern","position":[-472,138]},
+ #{"id":"transporter","position":[-551,-372]},
+ {"id":"transporter","position":[-83,-441]},
+ {"id":"standmerchant","position":[-193,680]},
+ {"name":"Zen Girl","id":"appearance","position":[-361,-832]},
+ {"id":"pvp","positions":[ [232,388],[325,499,1] ]}, #currently the direction is hard-coded at update_sprite [30/08/16]
+ #{"id":"guard","position":[889,-664]}, #dungeon
+ #{"id":"guard","position":[1588,-534]}, #dark forest 1
+ #{"id":"guard","position":[1610,-534]}, #dark forest 2
+ #{"id":"guard","position":[616,613]}, #mansion
+ {"id":"craftsman","position":[92,670]},
+ {"id":"pete","position":[-776,1256]},
+ #{"id":"citizen0","position":[-152,152]},
+ {"id":"citizen0","position":[0,0]},
+ {"id":"citizen2","position":[0,0]},
+ {"id":"citizen3","position":[0,0]},
+ {"id":"citizen4","position":[0,0]},
+ {"id":"antip2w","position":[274,-554]}, #shellsguy"
+ {"id":"friendtokens","position":[120,-560]},
+ {"id":"funtokens","position":[303,-87] or [105,-34] or [220,-151]},
+ #{"id":"funtokens","position":[225,-105]},
+ {"id":"bean","position":[74,-34],"boundary":[-100,-100,100,100]},
+ #{"id":"bean","positions":[ [-94,-47],[98,-50],[5,83] ],"loop":True}, # ,"manual":True
+ {"id":"secondhands","position":[106,-47] or [74,-34]},
+ {"id":"pvptokens","position":[159,403]},
+ {"id":"monsterhunter","position":[126,-413]},
+ {"id":"mcollector","position":[81,-283,1]},
+ #{"id":"newyear_tree","position":[64,-88]}, #xmas
+ ],
+ "monsters":[
+ #square
+ #{"type":"tiger","boundary":[-118,-100,118,100],"count":1}, #,"rage":[-118,-100,118,100]},
+
+ #beach
+ {"type":"crab","boundary":[-1353,-254,-1052,122],"count":8,"grow":True},
+ {"type":"squig","boundary":[-1353,126,-998,718],"count":6,"grow":True},
+ {"type":"squigtoad","boundary":[-1353,126,-998,718],"count":2},
+ {"type":"tortoise","boundary":[-1353,720,-896,1516],"count":6},
+ {"type":"frog","boundary":[-1353,720,-896,1516],"count":2},
+ {"type":"crabx","boundary":[-1256,1520,-712,2004],"count":5},
+ {"type":"crabxx","boundary":[-1256,1520,-712,2004],"count":0},
+
+ #targets
+ {"type":"target","boundary":[-571,323,-571,323],"count":1},
+ {"type":"target_a500","boundary":[-290,280,-290,280],"count":1},
+ {"type":"target_a750","boundary":[-270,280,-270,280],"count":1},
+ {"type":"target_r500","boundary":[-250,280,-250,280],"count":1},
+ {"type":"target_r750","boundary":[-230,280,-230,280],"count":1},
+ {"type":"target_ar900","boundary":[-210,280,-210,280],"count":1},
+ {"type":"target_ar500red","boundary":[-150,400,-150,400],"count":1},
+
+ #middle
+ {"type":"goo","boundary":[-282,702,218,872],"count":9,"grow":True},
+ #{"type":"slenderman","boundary":[-282,702,218,872],"count":1},
+ #{"type":"chestm","boundary":[-282,702,218,872],"count":3},
+ #{"type":"aqueen","boundary":[-282,702,218,872],"count":1},
+ #{"type":"pinkgoo","boundary":[-282,702,218,872],"count":1},
+ #{"type":"wabbit","boundary":[-282,702,218,872],"count":1},
+ {"type":"bee","boundary":[424,1014,668,1104],"count":4,"grow":True},
+ {"type":"bee","boundary":[418,994,570,1208],"count":3,"grow":True},
+ {"type":"bee","boundary":[52,1426,252,1548],"count":5,"grow":True},
+ {"type":"bee","boundary":[448,694,592,812],"count":3,"grow":True},
+ {"type":"bee","boundary":[678,676,796,764],"count":2,"grow":True},
+ {"type":"poisio","boundary":[-262,1198,20,1522],"count":5,"grow":True},
+ {"type":"croc","boundary":[696,1498,906,1922],"count":6,"grow":True},
+ {"type":"armadillo","boundary":[376,1696,676,1996],"count":6,"grow":True},
+ {"type":"snake","boundary":[-254,1812,90,1990],"count":6,"grow":True},
+
+ #final
+ {"type":"bigbird","boundary":[1100,160,1586,336],"count":5},
+ {"type":"spider","boundary":[700,-282,1196,-6],"count":7,"grow":True},
+ {"type":"scorpion","boundary":[1485,-390,1670,54],"count":6,"grow":True},
+
+ #phoenix
+ {"type":"phoenix",
+ "boundaries":[
+ ["main",708,-300,1668,-86],
+ ["main",378,1686,904,1920],
+ ["main",-1358,-118,-1010,1680],
+ ["halloween",-166,453,182,808],
+ ["cave",-375,-1287,14,-1041],
+ #["tunnel",-210,-1291,238,-853]
+ ],"count":1,"stype":"randomrespawn"},
+ #fairies
+ {"type":"greenfairy","boundary":[-460,-908,-260,-710],"count":1},
+ {"type":"redfairy","boundary":[-460,-908,-260,-710],"count":1},
+ {"type":"bluefairy","boundary":[-460,-908,-260,-710],"count":1},
+ #pets
+ {"type":"puppy1","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"puppy2","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"puppy3","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"puppy4","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"kitty1","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"kitty2","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"kitty3","boundary":[-766,1072,-643,1210],"count":1},
+ {"type":"kitty4","boundary":[-766,1072,-643,1210],"count":1},
+
+ #tavern area
+ #{"type":"porcupine","boundary":[-585,305,-146,547],"count":1},
+
+ #little farm
+ {"type":"hen","boundary":[-118,-317,-5,-247],"count":2},
+ {"type":"rooster","boundary":[-118,-317,-5,-247],"count":1},
+ ],
+ "doors":[
+ [-965,-176,24,30,"woffice",0,1],
+ [536,1665,64,32,"tunnel",0,2],
+ [168,-149,32,40,"bank",0,3],
+ [160,1370,24,32,"cave",0,4],
+ [232,384,24,30,"arena",0,6],
+ [-472,131,24,30,"tavern",0,8],
+ [616,610,32,40,"mansion",0,10],
+ [1936,-23,24,24,"level1",1,11],
+ [169,-404,24,40,"hut",0,14],
+ [1600,-547,60,40,"halloween",4,15],
+ [312,-335,32,32,"mtunnel",0,16],
+ [967,-584,32,32,"mtunnel",1,17],
+ [1472,-434,32,32,"mtunnel",2,18],
+ ],
+ "traps":[
+ {"type":"spikes","position":[-472,286]},
+ ],
+ "spawns":[
+ [0,0,0,100],
+ [-968,-163], #1-outside woffice
+ [535,1677], #2-tunnel
+ [168,-134], #3-outside the bank
+ [160,1381], #4-outside the cave
+ [-87,673], #5-on-death
+ [232,397], #6-outside the arena <- this one was the un-bounded problem [232,388] Added a new line_distance logic now [19/07/18]
+ [294,498], #7-arena death
+ [-472,149], #8-tavern-exit
+ #[-556,-271,3], #9-transporter-npc
+ [-85,-389,3], #9-transporter-npc
+ [616,621], #10-mansion
+ [1937,-12], #11-underground
+ [-1104,-924], #12-the island
+ [-551,-375], #13-old teleporter - new empty area
+ [169,-385], #14-hut
+ [1600,-524], #15-forest
+ [294,-347,1], #16-mtunnel
+ [968,-577], #17-mtunnel
+ [1471,-424], #18-mtunnel
+ ],
+ "quirks":[
+ [-236,-189,24,24,"upgrade"],
+ [-179,-189,24,24,"compound"],
+ [350,424,30,24,"list_pvp"],
+ [-200,15,24,42,"log","A relic from an old era"],
+ [200,15,24,42,"log","A relic from an old era"],
+ [1689,-494,20,16,"note","The Dark Forest. A curious place."],
+ [681,624,20,16,"sign","The Mansion"],
+ [65,544,20,16,"sign","Welcome to The New Town!"],
+ [-150,154,20,16,"sign","Town Square"],
+ [-365,144,20,16,"sign","Tavern"],
+ ],
+ "animatables":{
+ "the_door":{"x":888,"y":-672,"position":"door0"},
+ },
+ "on_death":["main",5],
+ "on_exit":["main",0],
+ "drop_norm":1000,
+ "ref":{
+ "u_mid":[-235,-203],
+ "c_mid":[-180,-203],
+ "cx":[-479.65,-919.23,-240.96,-697.72],
+ },
+ "zones":[
+ {
+ "type":"fishing",
+ "drop":"f1",
+ "polygon":[[-880,-352],[-1064,-352],[-1064,-336],[-1080,-336],[-1080,-320],[-1096,-320],[-1096,-304],[-1224,-304],[-1224,-288],[-1368,-288],[-1368,-272],[-1384,-272],[-1384,600],[-1424,600],[-1424,456],[-1616,456],[-1616,592],[-1536,592],[-1536,680],[-1384,680],[-1384,1648],[-1368,1648],[-1368,1744],[-1352,1744],[-1352,1760],[-1336,1760],[-1336,1872],[-1320,1872],[-1320,1952],[-1304,1952],[-1304,2016],[-1288,2016],[-1288,2032],[-1208,2032],[-1208,2048],[-1064,2048],[-1064,2064],[-920,2064],[-920,2080],[-904,2080],[-904,2096],[-808,2096],[-808,2112],[-736,2112],[-728,2112],[-728,2128],[-456,2128],[-456,2032],[-424,2032],[-424,2440],[-1880,2440],[-1880,-528],[-872,-528],[-872,-352]],
+ }
+ ],
+ "outside":True,
+ },
+ "mansion":{
+ "key":"jayson_Mansion",
+ "name":"The Mansion",
+ "npcs":[
+ {"id":"pwincess","position":[0,-303]},
+ ],
+ "monsters":[
+ {"type":"rat","boundary":[-217,-272,200,-24],"count":5},
+ {"type":"rat","boundary":[-408,-102,-158,27],"count":3},
+ {"type":"rat","boundary":[160,-97,402,29],"count":3},
+ {"type":"rat","boundary":[-388,-610,-282,-197],"count":3},
+ {"type":"rat","boundary":[-388,-610,-282,-197],"count":3},
+ {"type":"rat","boundary":[283,-604,382,-200],"count":3},
+ {"type":"rat","boundary":[-240,-487,249,-401],"count":4},
+ ],
+ "doors":[
+ [-1,12,40,24,"main",10,0],
+ [-0.05,-493.95,31.8,46.7,"tomb",0,1,"key","tombkey"]
+ ],
+ "spawns":[
+ [0,-21,3],
+ [-0.18,-481.98]
+ ],
+ "quirks":[
+ [-335,-111,30,40,"log","Locked"],
+ [338,-111,30,40,"log","Locked"],
+ [-334,-618,30,40,"log","Locked"],
+ [338,-618,30,40,"log","Locked"],
+ [338,-618,30,40,"log","Hotdamn. This one is locked too..."],
+ #[2,-490,30,40,"log","Locked."],
+ ],
+ "drop_norm":1000,
+ "lux":0.8,
+ },
+ "tomb":{
+ "key":"jayson_MansionCrypt",
+ "name":"The Tomb",
+ "monsters":[
+ {"type":"gredpro","boundary":[-484.75,-400.63,-165.11,-188.4],"count":1},
+ {"type":"ggreenpro","boundary":[-378.79,44.16,-115.78,308.73],"count":1},
+ {"type":"gbluepro","boundary":[198.5,-402.6,490.12,-43.68],"count":1},
+ {"type":"gpurplepro","boundary":[-137.74,-531.49,235.49,-476.06],"count":1},
+ ],
+ "doors":[
+ [0,-68.83,33.4,57.5,"mansion",1,0]
+ ],
+ "spawns":[
+ [0.82,-53.5]
+ ],
+ "instance":True,
+ "lux":0.8,
+ },
+ "jail":{
+ "key":"jayson_al_jail",
+ "name":"Jail",
+ "npcs":[
+ {"id":"jailer","position":[191,-156]},
+ ],
+ "monsters":[
+ {"type":"jrat","boundary":[-223,-140,225,156],"count":3},
+ ],
+ "doors":[
+ ],
+ "quirks":[
+ [-81,-165,30,40,"log","Locked"],
+ ],
+ "spawns":[
+ [-79,-153],
+ ],
+ "drop_norm":1000,
+ "irregular":True,
+ "lux":0.5,
+ },
+ "cyberland":{
+ "key":"cyberland",
+ "name":"Cyberland",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"mechagnome","boundary":[-16,-88,-17,-89],"count":1},
+ {"type":"mechagnome","boundary":[-6,-96,-7,-95],"count":1},
+ {"type":"mechagnome","boundary":[8,-96,7,-95],"count":1},
+ {"type":"mechagnome","boundary":[18,-88,17,-89],"count":1},
+ ],
+ "doors":[
+ [224,-162,16,16,"main",9,1],
+ ],
+ "quirks":[
+ [0,-100,80,30,"mainframe"],
+ ],
+ "spawns":[
+ [0,0,3],
+ [224,-162,3],
+ ],
+ "drop_norm":1000,
+ "irregular":True,
+ "lux":0.8,
+ },
+ "duelland":{
+ "key":"jayson_arena_pvp",
+ "key":"jayson_duel_arena",
+ "name":"Duelland",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "doors":[
+ [0,16,32,20,"main",7,0],
+ ],
+ "quirks":[
+ ],
+ "spawns":[
+ [0,0,3],
+ [-712,-800,0,40],
+ [712,-800,0,40],
+ ],
+ "drop_norm":1000,
+ "irregular":True,
+ "instance":True,
+ "pvp":True,
+ "loss":False,
+ "lux":0.8,
+ },
+ "hut":{
+ "key":"jayson_smallHut",
+ "name":"The Hut",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "doors":[
+ [0,17,32,24,"main",14,0],
+ ],
+ "spawns":[
+ [0,-9,3],
+ ],
+ "drop_norm":1000,
+ "safe":True,
+ "lux":0.6,
+ },
+ "woffice":{
+ "key":"jayson_smallNPCcave",
+ "name":"Wizard's Crib",
+ "npcs":[
+ {"id":"lostandfound","position":[-24,-178]},
+ {"id":"wnpc","position":[32,-178,3]},
+ ],
+ "monsters":[
+ {"type":"grinch","boundary":[-112,-142,60,-16],"count":1,"special":True},
+ ],
+ "doors":[
+ [-29,112,48,40,"main",1,0],
+ ],
+ "spawns":[
+ [-24,83,3],
+ ],
+ "zones":[
+ {
+ "type":"mining",
+ "drop":"m2",
+ "polygon":[[-184,-232],[-128,-232],[-128,-184],[-184,-184]],
+ }],
+ "lux":0.6,
+ "drop_norm":1000,
+ "safe":True,
+ },
+ "tavern":{
+ #"ignore":True,
+ "key":"jayson_tavern02",
+ "name":"The Tavern",
+ "npcs":[
+ {"id":"tbartender","position":[150,-202]},
+ {"id":"bouncer","position":[208,-156]},
+ ],
+ "monsters":[
+ ],
+ "doors":[
+ [1,23,48,20,"main",8,0],
+ [272,-220,28,36,"resort_e",0,1],
+ ],
+ "spawns":[
+ [0,-8,3],
+ [272,-200], #1-resort_e
+ ],
+ "quirks":[
+ [136,-215,32,40,"log","Impossible to reach. This is probably where they keep all the rare items."],
+ [-103,-229,20,16,"tavern_info"],
+ ],
+ "machines":[
+ {
+ "type":"dice",
+ "set":"custom", #sprite
+ "frames":[
+ [0,16*16,5*16,44],
+ [5*16,16*16,5*16,44],
+ [10*16,16*16,5*16,44],
+ [15*16,16*16,5*16,44],
+ [20*16,16*16,5*16,44],
+ [25*16,16*16,5*16,44],
+ ],
+ "subframes":[
+ [11,301,7,14], #0
+ [11+11,301,7,14], #1
+ [11+11*2,301,7,14], #2
+ [11+11*3,301,7,14], #3
+ [11+11*4,301,7,14], #4
+ [11+11*5,301,7,14], #5
+ [11+11*6,301,7,14], #6
+ [11+11*7,301,7,14], #7
+ [11+11*8,301,7,14], #8
+ [11+11*9,301,7,14], #9
+ [5,310,1,1], #. - manually calibrated all of these, it wasn't easy [07/02/18]
+ ],
+ "x":-169,
+ "y":-209,
+ },
+ {
+ "type":"slots",
+ "set":"custom",
+ "frames":[
+ [0,20*16,2*16,3*16],
+ [2*16,20*16,2*16,3*16],
+ [4*16,20*16,2*16,3*16],
+ ],
+ "x":-272,
+ "y":-216,
+ },
+ {
+ "type":"wheel",
+ "set":"custom",
+ "frames":[
+ [0,23*16,2*16,3*16],
+ [2*16,23*16,2*16,3*16],
+ [4*16,23*16,2*16,3*16],
+ ],
+ "x":-64,
+ "y":-216,
+ }
+ ],
+ "drop_norm":1000,
+ "lux":0.8,
+ },
+ "resort_e":{
+ #"ignore":True,
+ "key":"resort_e",
+ "name":"Holo Resort",
+ "npcs":[
+ ],
+ "animatables":{
+ "the_lever":{"x":-8,"y":-92,"position":"lever0"},
+ },
+ "monsters":[
+ ],
+ "doors":[
+ [-8,120,40,24,"tavern",1,0],
+ ],
+ "spawns":[
+ [-8,91,3],
+ ],
+ "quirks":[
+ [-8,-92,20,24,"the_lever"],
+ ],
+ "drop_norm":1000,
+ "lux":1,
+ },
+ "resort":{
+ #"ignore":True,
+ "key":"resort",
+ "name":"Holo Resort",
+ "npcs":[
+ {"id":"holo","position":[-8,-108]},
+ #{"id":"lostandfound","position":[77,-96]},
+ {"id":"holo0","position":[-8,0]},
+ {"id":"holo1","position":[-8,0]},
+ {"id":"holo2","position":[-8,0]},
+ {"id":"holo3","position":[-8,0]},
+ {"id":"holo4","position":[-8,0]},
+ {"id":"holo5","position":[-8,0]},
+ ],
+ "monsters":[
+ ],
+ "doors":[
+ [-8,120,40,24,"tavern",1,0],
+ ],
+ "spawns":[
+ [-8,91,3],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":1000,
+ "irregular":True,
+ "lux":0.75,
+ },
+ "winter_inn":{
+ "key":"jayson_winter_inn",
+ "name":"Wanderers' Inn",
+ "npcs":[
+ {"id":"wbartender","position":[-143,-220]},
+ {"id":"citizen1","position":[0,-5]},
+ {"id":"citizen5","position":[0,-5]},
+ {"id":"citizen6","position":[0,-5]},
+ #{"id":"mistletoe","position":[94,-181,2]}, #xmas
+ ],
+ "monsters":[
+ ],
+ "doors":[
+ [0,29,24,20,"winterland",2,0],
+ [47,-228,28,36,"winter_inn_rooms",0,1],
+ ],
+ "spawns":[
+ [0,-5,3],
+ [28,-208], #1-winter_inn_rooms
+ ],
+ "quirks":[
+ #[48,-232,26,36,"log","Locked"],
+ ],
+ "drop_norm":1000,
+ "lux":0.75,
+ },
+ "winter_inn_rooms":{
+ "key":"jayson_winter_inn_room1",
+ "name":"Rooms",
+ "npcs":[
+ ],
+ "monsters":[
+ ],
+ "doors":[
+ [0,25,24,20,"winter_inn",1,0],
+ ],
+ "spawns":[
+ [-0,-8,3],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":1000,
+ "unlist":True,
+ "lux":0.6,
+ },
+ "winter_cave":{
+ "key":"jayson_xmas_cave1",
+ "name":"Frozen Cave",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"bbpompom","boundary":[-234,-300,336,-28],"count":6},
+ {"type":"bbpompom","boundary":[-318,-1112,153,-786],"count":7},
+ ],
+ "doors":[
+ [3,41,36,20,"winterland",3,0],
+ [-170,-1157,32.5,36.5,"winter_cove",0,1],
+ ],
+ "spawns":[
+ [0,11,3],
+ [-169,-1144],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":4000,
+ "lux":0.5,
+ },
+ "winter_cove":{
+ "key":"jayson_frozenCave",
+ "name":"Frozen Cove",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"harpy","boundary":[-3.38,-398.22,273.25,-223.83],"count":5,"roam":True,"random":True},
+ {"type":"rharpy","boundary":[-3.38,-398.22,273.25,-223.83],"count":1,"roam":True},
+ ],
+ "doors":[
+ [-9,64,51,37.5,"winter_cave",1,0],
+ ],
+ "spawns":[
+ [-7.5,9.5,3],
+ [509.71,-228.7],
+ [253.08,-1849],
+ [59,-2242.92],
+ [-216.35,-1952.95],
+ [-695.12,-1935.26],
+ [248.55,-1487.53],
+ [37.21,-1338.83],
+ [210.45,-1225.44],
+ [71.03,-1143.93],
+ [-154.29,-1355.28],
+ [-285.29,-972.74],
+ [-894.25,-485.67],
+ [-590.74,-1532.24]
+
+ ],
+ "quirks":[
+ ],
+ "drop_norm":4000,
+ "lux":0.5,
+ },
+ "winter_instance":{
+ "key":"jayson_winterInstance",
+ "name":"Lair of the Dark Mage",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"xmagefz","boundary":[-255.17,-261.64,239.07,221.4],"count":1},
+ {"type":"xmagefi","boundary":[-255.17,-261.64,239.07,221.4],"count":0},
+ {"type":"xmagen","boundary":[-255.17,-261.64,239.07,221.4],"count":0},
+ {"type":"xmagex","boundary":[-255.17,-261.64,239.07,221.4],"count":0},
+ ],
+ "on_exit":["winterland",5],
+ "doors":[
+ [-7.23,250.26,38.15,28.55,"winterland",5,0],
+ ],
+ "spawns":[
+ [-8,216,3],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":4000,
+ "instance":True,
+ "lux":0.75,
+ },
+ "winterland":{
+ #"key":"jayson_IceLandPrototype",
+ "key":"jayson_WinterLandV2",
+ "name":"Winterland",
+ #"weather":"snow",
+ "freeze_multiplier":1.5,
+ "burn_multiplier":0.6,
+ "npcs":[
+ {"id":"leathermerchant","position":[262,-48.5]},
+ {"id":"transporter","position":[-73,-393]},
+ #{"id":"santa","position":[1242,-1631]}, #xmas
+ #{"id":"ornaments","position":[-137,-193,1]}, #xmas
+ {"id":"guard","position":[1065,-2015]},
+ {"id":"citizen7","position":[-15,5]},
+ {"id":"citizen8","position":[-15,5]},
+ {"id":"citizen9","position":[-15,5]},
+ {"id":"citizen10","position":[-15,5]},
+ ],
+ "monsters":[
+ {"type":"stompy","boundary":[30,-2954,836,-2536],"count":1},
+ {"type":"wolf","boundary":[30,-2954,836,-2536],"count":7},
+ #{"type":"rudolph","boundary":[1065,-1598,1418,-1449],"count":1}, #xmas
+ {"type":"arcticbee","boundary":[682,-967,1482,-779],"count":10,"grow":True},
+ {"type":"wolfie","boundary":[-367,-2234,29,-1819],"count":4},
+ {"type":"wolfie","boundary":[236,-2232,460,-1847],"count":3},
+ {"type":"boar","boundary":[-173,-1488,212,-730],"count":8},
+ {"type":"iceroamer","boundary":[550,-240,1097,149],"count":5},
+ {"type":"iceroamer","boundary":[1335,-71,1689,278],"count":4},
+ {"type":"icegolem","boundary":[782.25,395.96,888.71,450.28],"count":0,"roam":True},
+ ],
+ "doors":[
+ [-280,-132,32,40,"winter_inn",0,2],
+ [602,-1289,24,30,"winter_cave",0,3],
+ [-864,-1570,24,24,"level2n",2,4],
+ [1064.28,-2017.79,31.66,47.45,"winter_instance",0,5,"key","frozenkey"],
+ ],
+ "spawns":[
+ [0,0],
+ [-8,-337,3], #1-transports NPC
+ [-280,-123], #2-winter inn
+ [600,-1275], #3-xmas_cave1
+ [-864,-1614,3], #4-level2n
+ [1063,-2007], #5-winter_instance - HARD REFERENCED at server.js
+ [864.5,429.50], #6- ice golem
+ [1018.5,401.5], #7- island
+ ],
+ "quirks":[
+ [-247,-73,20,16,"sign","The Wanderers' Inn"],
+ [202,-56,20,16,"sign","Leather Shop. If I'm not outside, check inside!"],
+ [65,-1601,20,16,"sign","Dangers Ahead. Beware!"],
+ [465,-2296,20,16,"note","Stompy and his companions defeated me many times. However, I've discovered that If I stay just around the corner they can't even reach me! HAHA!"],
+ [-230,95,20,16,"log","Old Man's House"],
+ [168,-83,32,40,"log","Locked"],
+ [138,223,32,40,"log","Locked. This is probably where the guards stay"],
+ [413,-3080,24,30,"log","Can't reach. This might be Stompy's lair"],
+ [600.5,-1273,0,0,"info","darkmage"],
+ ],
+ "drop_norm":3000,
+ "lux":0.9,
+ "outside":True,
+ },
+ "desertland":{
+ "key":"jayson_desertlandW",
+ "freeze_multiplier":0.4,
+ "burn_multiplier":1.6,
+ "name":"Desertland",
+ "npcs":[
+ {"id":"transporter","position":[-14,-477]},
+ {"id":"locksmith","position":[316,-270]},
+ ],
+ "monsters":[
+ {"type":"plantoid","boundary":[-1013,-472,-575,-130],"count":4},
+ {"type":"plantoid","boundary":[-1013,-624,-762,-137],"count":4},
+ {"type":"porcupine","boundary":[-992,-58,-666,328],"count":8,"grow":True},
+ {"type":"ent","boundary":[-757,-2034,-70,-1888],"count":3},
+ {"type":"fireroamer","boundary":[91,-952,353,-702],"count":4},
+ {"type":"fireroamer","boundary":[161,-868,453,-697],"count":2},
+ {"type":"scorpion","boundary":[220.31,-1569.2,561.04,-1275.72],"count":6},
+ {"type":"bscorpion","boundary":[-522.44,-1340.19,-295.2,-1183.31],"count":1},
+ ],
+ "spawns":[
+ [0,0],
+ [10,-386],
+ [601,-2365], #2-desertland
+ ],
+ "doors":[
+ [600,-2383,40,40,"level2s",1,2],
+ ],
+ #"irregular":True,
+ "drop_norm":1000,
+ "outside":True,
+ },
+ "shellsisland":{
+ "key":"jayson_shells_island01",
+ "name":"New Town!",
+ "npcs":[
+ {"id":"wizardrepeater","position":[-190,26]},
+ ],
+ "monsters":[
+ {"type":"kitty1","boundary":[123,-235,270,-176],"count":1},
+ {"type":"kitty2","boundary":[123,-235,270,-176],"count":1},
+ {"type":"kitty3","boundary":[123,-235,270,-176],"count":1},
+ {"type":"kitty4","boundary":[123,-235,270,-176],"count":1},
+ {"type":"puppy1","boundary":[211,-234,271,-100],"count":1},
+ {"type":"puppy2","boundary":[211,-234,271,-100],"count":1},
+ {"type":"puppy3","boundary":[211,-234,271,-100],"count":1},
+ {"type":"puppy4","boundary":[211,-234,271,-100],"count":1},
+ ],
+ "spawns":[
+ [0,0],
+ ],
+ "drop_norm":1000,
+ "instance":True,
+ "outside":True,
+ },
+ "halloween":{
+ "key":"jayson_holloweenmap",
+ "key":"jayson_SpookyForestV2.2",
+ "name":"Spooky Forest",
+ "npcs":[
+ {"name":"Fancy Pots","id":"fancypots","position":[201,-180]},
+ #{"name":"Transporter","id":"transporter","position":[582,-117]},
+ {"name":"Transporter","id":"transporter","position":[-97,-330]},
+ {"id":"witch","position":[858,-160]},
+ {"id":"citizen11","position":[201,-160]},
+ {"id":"citizen12","position":[201,-160]},
+ {"id":"citizen13","position":[201,-160]},
+ ],
+ "monsters":[
+ {"type":"osnake","boundary":[-654,-384,-525,-287],"count":2},
+ {"type":"osnake","boundary":[-620,-986,-356,-431],"count":4},
+ #{"type":"snake","boundary":[-620,-986,-356,-431],"count":9,"grow":True},
+ {"type":"snake","boundary":[-720,-820,-418,-203],"count":9,"grow":True},
+ {"type":"greenjr","boundary":[-720,-820,-418,-203],"count":1},
+
+ {"type":"minimush","boundary":[-166,453,182,808],"count":8,"grow":True},
+ {"type":"mrpumpkin","boundary":[-671,571,-300,800],"count":1,"special":True},
+ {"type":"xscorpion","boundary":[-671,571,-300,800],"count":6},
+
+ {"type":"snake","boundary":[141,-792,552,-702],"count":6,"grow":True},
+ {"type":"osnake","boundary":[141,-792,552,-702],"count":2},
+ {"type":"tinyp","boundary":[141,-792,552,-702],"count":1},
+
+ {"type":"ghost","boundary":[284,-1351,446,-1189],"count":5},
+ {"type":"ghost","boundary":[54,-1277,237,-1078],"count":5},
+
+ {"type":"fvampire","boundary":[-664,-1808,-147,-1477],"count":1},
+ {"type":"ghost","boundary":[-664,-1808,-147,-1477],"count":9},
+ ],
+ "spawns":[
+ [0,0],
+ [-38,-283,2], #1-teleporter
+ #[103,-263,2], #2-spooky
+ [784,-1060], #2-spooky
+ [-1071,-1485], #3-level1
+ [1212,101,3], #4-main
+ ],
+ "doors":[
+ #[108,-260,32,32,"spookytown",1,2],
+ [784,-1085,80,40,"spookytown",1,2],
+ [-1071,-1496,40,40,"level1",2,3],
+ [1212,150,200,36,"main",15,4],
+ ],
+ "quirks":[
+ [-228,-178,32,40,"log","Locked but there are noises coming from inside"],
+ [331,-210,32,40,"log","Locked"],
+ [128,-251,20,16,"sign","Beware! Don't fall down!"],
+ ],
+ #"filter":"halloween",
+ "drop_norm":4000,
+ "outside":True,
+ "lux":0.9,
+ },
+ "spookytown":{
+ "key":"jayson_holloweenmap2",
+ "name":"Spooky Town",
+ "npcs":[
+ {"id":"citizen15","position":[300,-700],"boundary":[281,-836,508,-570]},
+ #{"id":"citizen15","position":[200,-1400],"boundary":[31,-1571,480,-1293]},
+ {"id":"citizen14","position":[0,0],"boundary":[-283,-222,289,234]},
+ ],
+ "monsters":[
+ {"type":"mummy","boundary":[31,-1571,480,-1293],"count":9,"rage":[-124,-1631,614,-1130]},
+ {"type":"booboo","boundary":[286,-842,544,-562],"count":5,"rage":[286,-842,544,-562]},
+
+ {"type":"stoneworm","boundary":[501,61,852,197],"count":4},
+ {"type":"stoneworm","boundary":[773,-198,1216,-68],"count":4},
+
+ {"type":"mrgreen","boundary":[524,860,748,1129],"count":1,"special":True},
+ {"type":"jr","boundary":[-970,-413,-597,-189],"count":1},
+ ],
+ "spawns":[
+ [0,0],
+ #[71,-68], #1-halloween
+ [32,1404,3], #1-halloween
+ [192,-194,1], #2-level2
+ ],
+ "doors":[
+ #[72,-80,32,40,"halloween",2,1],
+ [34,1449,80,30,"halloween",2,1],
+ [240,-181,48,32,"level2",5,2],
+ ],
+ "quirks":[
+ [-63,-44,30,24,"invisible_statue"],
+ ],
+ "ref":{
+ "poof":{"map":"spookytown","in":"spookytown","x":-63,"y":-44},
+ },
+ "drop_norm":4000,
+ "outside":True,
+ "lux":0.9,
+ },
+ "tunnel":{
+ "key":"jayson_miningtunnel_new",
+ "name":"Mining Tunnel",
+ "npcs":[
+ {"id":"gemmerchant","position":[-264,-96,2]},
+ ],
+ "monsters":[
+ {"type":"mole","boundary":[-210,-1291,238,-853],"count":8},
+ {"type":"mole","boundary":[-238,-638,207,-21],"count":7},
+ ],
+ "spawns":[[0,-16,3]], # 1 left, 2 right, 3 back
+ "doors":[
+ [2,18,64,32,"main",2,0], #.spawns[1]
+ ],
+ "quirks":[
+ [50,-678,20,16,"sign","Beware: Mole's Bite"],
+ [64,-1341,24,30,"log","Gloomy"],
+ ],
+ "drop_norm":5000,
+ "zones":[
+ {
+ "type":"mining",
+ "drop":"m1",
+ "polygon":[[296,-16],[296,-128],[256,-128],[256,-280],[272,-280],[272,-360],[264,-360],[264,-520],[296,-520],[296,-680],[120,-680],[120,-840],[280,-840],[280,-904],[272,-904],[272,-1224],[296,-1224],[296,-1288],[280,-1288],[280,-1304],[200,-1304],[200,-1328],[-64,-1328],[-64,-1320],[-200,-1320],[-200,-1328],[-288,-1328],[-288,-1160],[-248,-1160],[-240,-1160],[-240,-952],[-288,-952],[-288,-840],[-152,-840],[-144,-840],[-144,-808],[-112,-808],[-112,-680],[-288,-680],[-288,-504],[-272,-504],[-272,-168],[-288,-168],[-288,8],[-424,8],[-424,-1440],[384,-1440],[384,-16]],
+ }
+ ],
+ "lux":0.65,
+ },
+ "batcave":{
+ "ignore":True,
+ "key":"batcave",
+ "name":"Cave of Beginnings",
+ "npcs":[
+ #{"name":"Transporter","id":"transporter","position":[100,100]},
+ ],
+ "monsters":[
+ {"type":"bat","boundary":[-210,-170,342,185],"count":12},
+ {"type":"mvampire","boundary":[-210,-170,342,185],"count":1},
+ ],
+ "spawns":[[-200,190,3]], # 1 left, 2 right, 3 back
+ "doors":[
+ [-195,213,24,20,"main",1], #.spawns[1]
+ ],
+ "drop_norm":4500,
+ },
+ "arena":{
+ "key":"arena3",
+ "name":"Arena",
+ "npcs":[
+ #{"name":"Transporter","id":"transporter","position":[-50,-50]},
+ ],
+ "monsters":[
+ {"type":"cgoo","boundary":[-376,-888,1144,48],"polygon":[[-376,48],[1144,48],[1144,-888],[248,-888],[248,-776],[520,-776],[520,-560],[248,-560],[248,-376],[288,-376],[288,-336],[328,-336],[328,-304],[480,-304],[480,-344],[512,-344],[512,-368],[720,-368],[720,-192],[688,-192],[688,-152],[608,-152],[608,-120],[272,-120],[272,-152],[104,-152],[104,-200],[-128,-200],[-128,-400],[240,-400],[240,-888],[-376,-888]],"count":32},
+ {"type":"skeletor","boundary":[259,-764,500,-579],"count":1},
+ ],
+ "spawns":[[151.6,40.82]],
+ "doors":[
+ [152.99,85.42,60.9,40.55,"main",6,0],
+ ],
+ "on_death":["main",7], #pvp death main.spawns[3]
+ "safe_pvp":True,
+ "pvp":True,
+ "drop_norm":2000,
+ "lux":0.45,
+ },
+ # Name Ideas: The Entrance, Bog, The Depraved Waters, Underground Cove, Soul Nexus, Subterrane
+ "level1":{
+ "key":"jayson_underground_level1v2",
+ "name":"Underground [Entrance]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"prat","boundary":[-86,17,64,212],"count":5},
+ {"type":"prat","boundary":[-308,629,0,762],"count":5},
+ ],
+ "spawns":[
+ [149,87,1],
+ [0,9], #1-main
+ [-408,-258,3], #2-halloween
+ [-863,89,3], #3-cave
+ [-327,511,3], #4-level2
+ ], # 1 left, 2 right, 3 back
+ "doors":[
+ [0,-4,20,50,"main",11,1],
+ [-408,-275,20,50,"halloween",3,2],
+ [-865,77,20,50,"cave",1,3],
+ [-313,544,24,24,"level2",1,4],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "small_steps":True,
+ "lux":0.4,
+ },
+ "level2":{
+ "key":"jayson_underground_level2.2",
+ #"key":"jayson_underground_level2",
+ "name":"Underground [Passing]",
+ "npcs":[
+ {"id":"thief","position":[-133,-187]},
+ {"id":"citizen16","position":[-46,-168]},
+ ],
+ "monsters":[
+ ],
+ "spawns":[
+ [39,177,3], #0-level3
+ [1,-5], #1-level1
+ [-87,256,3], #2-level2s
+ [216,170,1], #3-level2e
+ [-303,-69,2], #4-level2w
+ [75,56], #5-spookytown
+ [-279.95,-249.15], #6-bank_u
+ ],
+ "doors":[
+ [40,219,24,24,"level3",0,0],
+ [0,-20,20,50,"level1",4,1],
+ [-87,300,80,40,"level2s",0,2],
+ [247,193,40,110,"level2e",1,3],
+ [-327,-45,40,110,"level2w",0,4],
+ [79,41,20,50,"spookytown",2,5],
+ [-280.14,-260.37,34.84,51.33,"bank_u",0,6,"ulocked","complicated"],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+ "level2n":{
+ "key":"jayson_underground_level2_northv2",
+ "name":"Underground [North]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"pppompom","boundary":[-621,-241,-234,-65],"count":6},
+ {"type":"pppompom","boundary":[153,-303,432,-75],"count":7},
+ ],
+ "spawns":[
+ [0,0,3], #0-level2w
+ [-416,0,3], #1-level2w
+ [-112,-676], #2-winterland
+ ],
+ "doors":[
+ [0,38,120,45,"level2w",1,0],
+ [-416,38,60,45,"level2w",2,1],
+ [-112,-691,20,40,"winterland",4,2],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+ "level2e":{
+ "key":"jayson_underground_level2_eastv2",
+ "name":"Underground [East]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"pinkgoblin","polygon":[[384,-96],[464,-96],[464,-64],[608,-64],[608,144],[568,144],[568,304],[464,304],[464,328],[368,328],[368,208],[344,208],[344,160],[384,160]],"boundary":[344,-96,608,328],"count":3}
+ ],
+ "spawns":[
+ [18.5,459.5,2], #0-level2s
+ [3.5,0,2], #1-level2
+ ],
+ "doors":[
+ [-7,502,40,140,"level2s",2,0],
+ [-23,40,40,140,"level2",3,1],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+ "level2s":{
+ "key":"jayson_underground_level2_southv2",
+ "name":"Underground [South]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"cgoo","boundary":[-52.5,359.33,120.29,646.25],"count":8},
+ ],
+ "spawns":[
+ [0,-14], #0-level2
+ [-240,681], #1-desertland
+ [383,539,1], #2-level2e
+ ],
+ "doors":[
+ [0,-20,40,40,"level2",2,0],
+ [-240,668,20,50,"desertland",2,1],
+ [406,580,40,140,"level2e",0,2],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+ "level2w":{
+ "key":"jayson_underground_level2_westv2",
+ "name":"Underground [West]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"oneeye","boundary":[-447,9,-208,323],"count":5},
+ {"type":"franky","boundary":[-447,9,-208,323],"count":0,"special":True},
+ ],
+ "spawns":[
+ [16,9,1], #0-level2
+ [-96,-184], #1-level2n
+ [-528,-184], #2-level2n
+ ],
+ "doors":[
+ [39,53,40,140,"level2",4,0],
+ [-96,-197,60,40,"level2n",0,1],
+ [-528,-197,60,40,"level2n",1,2],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+ "level3":{
+ "key":"jayson_underground_level3v2",
+ "name":"Underground [Deeps]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"mummy","boundary":[-451.21,-397.41,-240.59,-65.16],"count":3},
+ {"type":"bbpompom","boundary":[131.97,-368.95,398.99,-56.88],"count":4},
+ ],
+ "spawns":[
+ [0,10], #0-level2
+ [-28,-438,2], #1-level4
+ ],
+ "doors":[
+ [0,-5,20,50,"level2",0,0],
+ [-8,-409,24,24,"level4",0,1],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+ "level4":{
+ "key":"jayson_underground_level4v2",
+ "name":"Underground [Abyss]",
+ "npcs":[
+ ],
+ "monsters":[
+ {"type":"cgoo","boundary":[-366.74,-395.74,-109.59,-152.68],"count":6},
+ {"type":"mummy","boundary":[119.92,-4.27,378.46,338.17],"count":3},
+ ],
+ "spawns":[
+ [0,14],
+ [291,-140], #jump point
+ ],
+ "doors":[
+ [0,-3,20,50,"level3",1,0],
+ ],
+ "quirks":[
+ ],
+ "drop_norm":5000,
+ "unlist":True,
+ "lux":0.4,
+ },
+
+}
+for name in maps:
+ if not maps[name].get("doors"): maps[name]["doors"]=[]
+ if not maps[name].get("npcs"): maps[name]["npcs"]=[]
\ No newline at end of file
diff --git a/design/monsters.py b/design/monsters.py
new file mode 100644
index 0000000..1a36012
--- /dev/null
+++ b/design/monsters.py
@@ -0,0 +1,1333 @@
+import math
+monsters={
+ "goo":{
+ "name":"Goo","speed":6,"charge":12,"hp":100,"xp":100,"attack":5,"damage_type":"physical","respawn":1,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":1,
+ #"immune":True,
+ #"respawn_as":"bee",
+ #"explosion":2000,
+ "achievements":[
+ [10,"stat","hp",5],
+ [100,"stat","hp",10],
+ [1000,"stat","mp",5],
+ [10000,"stat","dex",1],
+ [100000,"stat","str",1],
+ [1000000,"stat","int",1],
+ [10000000,"stat","speed",0.25],
+ ],
+ },
+ "bee":{
+ "name":"Bee","speed":12,"hp":300,"xp":400,"attack":16,"damage_type":"physical","respawn":2,"gold":40,"range":20,"frequency":0.5,"aggro":1,"aa":1,"rage":0.1,
+ "phresistance":60,
+ #"respawn_as":"goo",
+ "achievements":[
+ [10,"stat","hp",5],
+ [100,"stat","mp",5],
+ [1000,"stat","mp",5],
+ [10000,"stat","attack",2],
+ [100000,"stat","apiercing",2],
+ [1000000,"stat","attack",3],
+ [10000000,"stat","xp",1],
+ ]
+ },
+ "cutebee":{
+ "name":"Cute Bee","speed":12,"hp":300,"xp":400,"attack":16,"damage_type":"physical","respawn":-1,"gold":40,"range":20,"frequency":0.5,"aggro":1,"aa":1,"rage":0.05,
+ "phresistance":60,
+ "explanation":"Spawns in Mainland around every 480,000 Bee spawns",
+ #"for":912,
+ "avoidance":99.9,
+ "achievements":[
+ [1,"stat","hp",10],
+ [20,"stat","for",1],
+ ],
+ "cute":True,
+ },
+ "squig":{
+ "name":"Squig","speed":10,"hp":1000,"xp":600,"attack":7,"damage_type":"physical","respawn":12,"gold":100,"range":15,"frequency":0.5,"aggro":0,"aa":1,
+ "achievements":[
+ [10,"stat","mp",5],
+ [100,"stat","mp",5],
+ [1000,"stat","mp",10],
+ [10000,"stat","mp",10],
+ [100000,"stat","evasion",0.25],
+ [1000000,"stat","resistance",5],
+ [10000000,"stat","evasion",1],
+ ]
+ },
+ "squigtoad":{
+ "name":"Squigtoad","speed":16,"hp":9600,"xp":32000,"attack":24,"damage_type":"physical","respawn":120,"gold":200,"range":20,"frequency":0.6,"aggro":0,
+ "difficulty":3,
+ "achievements":[
+ [10,"stat","mp",5],
+ [100,"stat","mp",5],
+ [1000,"stat","mp",5],
+ [10000,"stat","evasion",0.25],
+ [100000,"stat","int",1],
+ [1000000,"stat","attack",5],
+ [10000000,"stat","evasion",1],
+ ]
+ },
+ "tortoise":{
+ "name":"Tortoise","speed":10,"hp":7200,"xp":5200,"attack":36,"damage_type":"physical","respawn":12,"gold":60,"range":15,"frequency":0.5,"aggro":0,"armor":200,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","hp",20],
+ [10000,"stat","armor",5],
+ [100000,"stat","str",1],
+ [1000000,"stat","speed",0.5],
+ [10000000,"stat","armor",10],
+ ]
+ },
+ "frog":{
+ "name":"Froggie","speed":10,"hp":600,"xp":7200,"attack":24,"damage_type":"physical","respawn":960,"gold":300,"range":15,"frequency":0.5,"aggro":0,"evasion":99,
+ "difficulty":12,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","vit",1],
+ [1000,"stat","int",1],
+ [10000,"stat","evasion",0.5],
+ [100000,"stat","int",3],
+ [1000000,"stat","vit",4],
+ [10000000,"stat","evasion",1],
+ ]
+ },
+ "rat":{
+ "name":"Rat","speed":12,"hp":820,"xp":640,"attack":80,"damage_type":"physical","respawn":2,"gold":32,"range":40,"frequency":0.5,"aggro":1,"rage":1,
+ "difficulty":1.4,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","mp",5],
+ [1000,"stat","armor",2],
+ [10000,"stat","gold",0.5],
+ [100000,"stat","attack",5],
+ [1000000,"stat","rpiercing",3],
+ [10000000,"stat","attack",20],
+ ]
+ },
+ "jrat":{
+ "name":"Rat","skin":"rat","speed":12,"hp":4000,"xp":100,"attack":240,"damage_type":"physical","respawn":42,"gold":5,"range":40,"frequency":0.5,"aggro":0,
+ "difficulty":0.2,
+ "achievements":[
+ [1000000,"stat","for",5],
+ ]
+ },
+ "croc":{
+ "name":"Croc","speed":10,"hp":3200,"xp":3600,"attack":48,"damage_type":"physical","respawn":6,"gold":55,"range":15,"frequency":0.5,"aggro":0.2,"rage":1,"aa":0,
+ "armor":40,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",10],
+ [1000,"stat","resistance",1],
+ [10000,"stat","for",1],
+ [100000,"stat","speed",0.25],
+ [1000000,"stat","attack",10],
+ [10000000,"stat","dreturn",1],
+ ]
+ },
+ "mole":{
+ "name":"Mole","speed":18,"charge":60,"hp":12400,"xp":8000,"attack":480,"damage_type":"physical","respawn":6,"gold":120,"range":15,"frequency":0.8,"aggro":1,"rage":1,"apiercing":320,
+ "difficulty":1.2,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","for",1],
+ [10000,"stat","str",1],
+ [100000,"stat","attack",5],
+ [1000000,"stat","apiercing",5],
+ [10000000,"stat","gold",1],
+ ]
+ },
+ "crab":{
+ "name":"Tiny Crab","speed":6,"hp":400,"xp":500,"attack":24,"damage_type":"physical","respawn":0.64,"gold":30,"range":15,"frequency":0.4,"aggro":0.2,"size":0.5,
+ "armor":160,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",10],
+ [1000,"stat","mp",5],
+ [10000,"stat","attack",5],
+ [100000,"stat","hp",200],
+ [1000000,"stat","rpiercing",3],
+ [10000000,"stat","range",2],
+ [100000000,"stat","hp",5],
+ ]
+ },
+ "crabx":{
+ "name":"Huge Crab","speed":8,"charge":30,"hp":4200,"xp":3600,"attack":240,"damage_type":"physical","respawn":4,"gold":120,"range":15,"frequency":0.3,"aggro":0.5,
+ "armor":210,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",10],
+ [1000,"stat","armor",1],
+ [10000,"stat","str",1],
+ [100000,"stat","speed",0.5],
+ [1000000,"stat","luck",0.5],
+ [10000000,"stat","hp",400],
+ ]
+ },
+ "crabxx":{
+ "skin":"crabx",
+ "name":"Giga Crab","speed":30,"charge":80,"hp":960000,"xp":720000,"attack":16000,"damage_type":"physical","respawn":-1,"gold":120,"range":45,"size":1.5,"frequency":0.3,"aggro":0,
+ "armor":320,
+ "difficulty":10,
+ "special":True,
+ "phresistance":30,
+ "announce":"#B73237",
+ "spawns":[[1000,"crabx"]],
+ "cooperative":True,
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","luck",1],
+ ]
+ },
+ "armadillo":{
+ "name":"Armadillo","speed":14,"hp":1600,"xp":1720,"attack":20,"damage_type":"physical","respawn":3,"gold":80,"range":20,"frequency":0.5,"aggro":0,"dreturn":30,
+ "armor":60,
+ "difficulty":1.1,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",10],
+ [1000,"stat","armor",1],
+ [10000,"stat","for",1],
+ [100000,"stat","dreturn",0.5],
+ [1000000,"stat","armor",10],
+ [10000000,"stat","dreturn",1],
+ ]
+ },
+ "porcupine":{
+ "name":"Porcupine","speed":10,"charge":30,"hp":3800,"xp":3200,"attack":16,"damage_type":"physical","respawn":2,"gold":40,"range":20,"frequency":0.5,"aggro":1,"rage":0.4,"dreturn":4800,
+ "armor":120,
+ "difficulty":1.2,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",10],
+ [1000,"stat","for",1],
+ [10000,"stat","for",1],
+ [100000,"stat","dreturn",0.5],
+ [1000000,"stat","hp",300],
+ [10000000,"stat","armor",10],
+ ]
+ },
+ "hen":{
+ "name":"Chicken","speed":10,"hp":60,"xp":10,"attack":48,"damage_type":"physical","respawn":200,"gold":40,"range":20,"frequency":1.5,"aggro":1,"rage":0.2,"cute":True,
+ "achievements":[
+ [1000,"stat","gold",2],
+ ]
+ },
+ "rooster":{
+ "name":"Chicken","speed":7,"hp":60,"xp":10,"attack":48,"damage_type":"physical","respawn":200,"gold":40,"range":20,"frequency":1.5,"aggro":1,"rage":0.2,"cute":True,
+ "achievements":[
+ [1000,"stat","for",1],
+ ]
+ },
+ "osnake":{
+ "name":"Snake","speed":12,"hp":720,"xp":1600,"attack":24,"damage_type":"physical","respawn":60,"gold":150,"range":20,"frequency":0.6,"aggro":0,
+ "difficulty":2,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","str",1],
+ [100000,"stat","speed",0.25],
+ [1000000,"stat","armor",5],
+ [10000000,"stat","xp",1],
+ ]
+ },
+ "snake":{
+ "name":"Snake","speed":12,"hp":720,"xp":960,"attack":24,"damage_type":"physical","respawn":3,"gold":60,"range":20,"frequency":0.6,"aggro":0,
+ "achievements":[
+ [10,"stat","mp",5],
+ [100,"stat","hp",10],
+ [1000,"stat","vit",1],
+ [10000,"stat","dex",1],
+ [100000,"stat","speed",0.25],
+ [1000000,"stat","armor",5],
+ [10000000,"stat","resistance",10],
+ ]
+ },
+ "scorpion":{
+ "name":"Scorpion","speed":24,"hp":24000,"xp":20000,"attack":100,"damage_type":"physical","respawn":6,"gold":100,"range":32,"frequency":0.8,"aggro":0.3,
+ "armor":200,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","armor",1],
+ [10000,"stat","dex",1],
+ [100000,"stat","int",1],
+ [1000000,"stat","str",1],
+ [10000000,"stat","attack",15],
+ ]
+ },
+ "gscorpion":{
+ "name":"Scorpion","speed":24,"hp":32000,"xp":48000,"attack":120,"damage_type":"physical","respawn":6,"gold":240,"range":32,"frequency":0.8,"aggro":0.3,
+ "armor":300,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","mp",10],
+ [10000,"stat","int",1],
+ [100000,"stat","dex",1],
+ [1000000,"stat","vit",2],
+ [10000000,"stat","attack",30],
+ ]
+ },
+ "xscorpion":{
+ "name":"Scorpion","speed":24,"hp":140000,"xp":172000,"attack":720,"damage_type":"physical","respawn":16,"gold":920,"range":32,"frequency":0.8,"aggro":0.3,
+ "armor":400,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",30],
+ [1000,"stat","dex",1],
+ [10000,"stat","apiercing",2],
+ [100000,"stat","rpiercing",3],
+ [1000000,"stat","frequency",2],
+ [10000000,"stat","attack",25],
+ ],
+ },
+ "bscorpion":{
+ "name":"Black Scorpion","speed":24,"hp":576900,"xp":634800,"armor":600,"resistance":400,"attack":3200,"damage_type":"physical","respawn":6,"gold":920,"range":32,"frequency":0.6,"aggro":0.8,
+ "armor":500,
+ "resistance":240,
+ "crit":10,
+ "poisonous":True,
+ "abilities":{
+ "weakness_aura":{
+ "aura":True,
+ "condition":"weakness",
+ "radius":100,
+ "cooldown":4000,
+ }
+ },
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","dex",0.5],
+ [10000,"stat","dex",0.5],
+ ],
+ },
+ "ghost":{
+ "name":"Ghost","speed":12,"hp":12000,"xp":16000,"attack":200,"damage_type":"magical","respawn":4,"gold":600,"range":120,"frequency":1,"aggro":0.05,"hit":"explode_p","evasion":20,"resistance":400,
+ "phresistance":90,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","for",1],
+ [10000,"stat","int",1],
+ [100000,"stat","int",1],
+ [1000000,"stat","hp",300],
+ [10000000,"stat","resistance",10],
+ ]
+ },
+ "harpy":{
+ "name":"Harpy","speed":12,"charge":96,"hp":160000,"xp":192000,"attack":1720,"damage_type":"magical","respawn":4,"gold":600,"range":220,"frequency":0.8,"aggro":0.01,"hit":"explode_p","resistance":600,"armor":160,
+ #"cooperative":True,
+ "difficulty":2,
+ "rpiercing":160,
+ "phresistance":40,
+ "charge_skin":"harpy_fly",
+ "slots":{"mainhand":{"name":"harbringer","level":6}},
+ "abilities":{"warp_on_hit":{"unlimited":True,"attr0":0.8/10}},
+ "achievements":[
+ [10,"stat","hp",10],
+ [1000,"stat","fzresistance",0.5],
+ [10000,"stat","fzresistance",0.5],
+ [100000,"stat","fzresistance",0.5],
+ [200000,"stat","speed",0.25],
+ ]
+ },
+ "rharpy":{
+ "name":"Rebel Harpy","speed":18,"charge":116,"hp":320000,"xp":332000,"attack":1420,"damage_type":"magical","respawn":400,"gold":600,"range":30,"frequency":0.7,"aggro":1.2,"rage":1.2,"hit":"momentum","resistance":240,"armor":360,
+ "cooperative":True,
+ "difficulty":3,
+ "apiercing":160,
+ "phresistance":60,
+ "charge_skin":"rharpy_fly",
+ "slots":{"mainhand":{"name":"basher","level":9}},
+ "achievements":[
+ [1,"stat","mp",5],
+ [10,"stat","attack",2],
+ [1000,"stat","stresistance",1],
+ [10000,"stat","stresistance",1],
+ [20000,"stat","speed",0.25],
+ ]
+ },
+ "fvampire":{
+ "name":"Ms. Dracul","speed":40,"hp":240000,"xp":200000,"attack":875,"damage_type":"magical","respawn":24*60,"gold":24000,"range":120,"frequency":1.2,"aggro":0.05,"hit":"explode_c","prefix":"","resistance":300,"armor":100,
+ "humanoid":True,
+ "rbuff":"mlifesteal",
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","attack",5],
+ [10000,"stat","for",1],
+ [100000,"stat","xp",2.5],
+ [1000000,"stat","lifesteal",1],
+ [10000000,"stat","lifesteal",2.5],
+ ]
+ },
+ "minimush":{
+ "name":"Pom Pom","speed":12,"hp":500,"xp":600,"attack":120,"damage_type":"magical","respawn":4,"gold":70,"range":120,"frequency":1,"aggro":0.05,"hit":"explode_p",
+ "resistance":120,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","for",1],
+ [10000,"stat","frequency",0.25],
+ [100000,"stat","resistance",5],
+ [1000000,"stat","str",2],
+ [10000000,"stat","speed",1],
+ ]
+ },
+ "spider":{
+ "name":"Spider","speed":24,"hp":18000,"xp":12000,"attack":80,"damage_type":"physical","respawn":14,"gold":180,"range":32,"frequency":1,"aggro":0.3,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","armor",1],
+ [10000,"stat","for",1],
+ [100000,"stat","str",1],
+ [1000000,"stat","crit",0.25],
+ [10000000,"stat","vit",8],
+ ]
+ },
+ "bat":{
+ "name":"Bat","speed":24,"hp":9600,"xp":8000,"attack":50,"damage_type":"physical","respawn":12,"gold":120,"range":35,"frequency":0.7,"aggro":0.3,"aa":1,
+ "resistance":120,
+ "phresistance":35,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","armor",1],
+ [10000,"stat","dex",1],
+ [100000,"stat","str",2],
+ [1000000,"stat","gold",0.5],
+ [10000000,"stat","lifesteal",1],
+ ]
+ },
+ "nerfedbat":{
+ "skin":"bat",
+ "name":"Bat","speed":24,"hp":2400,"xp":400,"attack":50,"damage_type":"physical","respawn":12,"gold":120,"range":35,"frequency":0.7,"aggro":0.3,"aa":1,
+ "resistance":120,
+ "phresistance":35,
+ "achievements":[
+ [100000,"stat","dex",1],
+ [1000000,"stat","luck",0.5],
+ ]
+ },
+ "dknight2":{
+ "name":"Dark Knight","speed":28,"hp":86000,"xp":72000,"attack":2275,"damage_type":"physical","respawn":40,"gold":800,"range":32,"frequency":1.2,"aggro":0.3,"armor":200,"hide":True,
+ "achievements":[
+ [1,"stat","luck",50],
+ ]
+ },
+ "mvampire":{
+ "name":"Dracul","speed":40,"hp":240000,"xp":200000,"attack":245,"damage_type":"magical","respawn":18*60,"gold":16000,"range":120,"frequency":1.2,"aggro":0.05,"hit":"explode_c","prefix":"","resistance":150,"armor":90,
+ "humanoid":True,
+ "rbuff":"mlifesteal",
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","attack",5],
+ [10000,"stat","resistance",5],
+ [100000,"stat","resistance",5],
+ [1000000,"stat","lifesteal",1],
+ [10000000,"stat","lifesteal",2.5],
+ ]
+ },
+ "phoenix":{
+ "name":"Phoenix","speed":50,"hp":160000,"xp":180000,"attack":125,"damage_type":"magical","respawn":32,"gold":7200,"range":120,"frequency":1.2,"aggro":0.2,"aa":1,"hit":"explode_a","prefix":"the",
+ "phresistance":40,
+ "resistance":160,
+ "cooperative":True,
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","int",1],
+ [100000,"stat","resistance",5],
+ [1000000,"stat","resistance",10],
+ [10000000,"stat","frequency",1],
+ ]
+ },
+ "cgoo":{
+ "name":"Irradiated Goo","speed":9,"hp":2400,"xp":4800,"attack":320,"damage_type":"physical","respawn":48,"gold":240,"range":64,"frequency":1.2,"aggro":0.1,"aa":1,
+ "resistance":260,
+ "difficulty":6,
+ "achievements":[
+ [10,"stat","hp",20],
+ [100,"stat","vit",1],
+ [1000,"stat","for",1],
+ [10000,"stat","hp",100],
+ [100000,"stat","for",2],
+ [1000000,"stat","vit",3],
+ [10000000,"stat","for",5],
+ ]
+ },
+ "bgoo":{
+ "name":"Brawl Goo","skin":"goo4","speed":6,"charge":12,"hp":100000,"xp":100000,"attack":5,"damage_type":"physical","respawn":-1,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":1,
+ "armor":200,
+ "resistance":200,
+ "cooperative":True,
+ "special":True,
+ "size":1.5,
+ #"immune":True,
+ #"respawn_as":"bee",
+ #"explosion":2000,
+ "achievements":[
+ [1000,"stat","vit",1],
+ ],
+ },
+ "rgoo":{
+ "name":"Rainbow Goo","skin":"gooD","speed":9,"hp":1000000,"xp":48000000,"attack":320,"damage_type":"physical","respawn":-1,"gold":240,"range":64,"frequency":1.2,"aggro":0.1,"aa":1,
+ "armor":300,
+ "resistance":300,
+ "size":1.5,
+ "cooperative":True,
+ "special":True,
+ "achievements":[
+ [1,"stat","hp",20],
+ [100,"stat","for",1],
+ ]
+ },
+ "skeletor":{
+ "name":"Skeletor","speed":40,"hp":80000,"xp":120000,"attack":1800,"damage_type":"physical","respawn":16*60,"gold":20000,"range":80,"frequency":1.2,"aggro":0.2,
+ "slots":{"mainhand":{"name":"scythe","level":8}},
+ "achievements":[
+ [1,"stat","for",1],
+ [100,"stat","vit",1],
+ [1000,"stat","for",2],
+ [10000,"stat","vit",3],
+ [100000,"stat","crit",0.25],
+ [1000000,"stat","for",10],
+ [10000000,"stat","for",20],
+ ]
+ },
+ "ligerx":{
+ "name":"Liger X","speed":30,"hp":80000,"xp":120000,"attack":1800,"damage_type":"physical","respawn":16*60,"gold":20000,"range":80,"frequency":1.2,"aggro":0.2,"charge":60,"explanation":"A genetically modified and cybernetically enhanced beast!",
+ "achievements":[
+ [1,"stat","luck",50],
+ ]
+ },
+
+ #main2
+ "bigbird":{
+ "name":"Hawk","speed":24,"charge":52,"hp":32000,"xp":30000,"attack":480,"damage_type":"physical","respawn":12,"gold":480,"range":20,"frequency":0.8,"aggro":1,"rage":0.4,"evasion":20,"aa":1,
+ "phresistance":30,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",30],
+ [1000,"stat","vit",1],
+ [10000,"stat","evasion",0.25],
+ [100000,"stat","resistance",5],
+ [1000000,"stat","speed",0.5],
+ [10000000,"stat","evasion",1],
+ ]
+ },
+ "poisio":{
+ "name":"Poisio","speed":24,"hp":3600,"xp":4000,"attack":240,"damage_type":"physical","respawn":6,"gold":80,"range":20,"frequency":0.6,"aggro":1,"rage":0.2,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","armor",2],
+ [10000,"stat","dex",1],
+ [100000,"stat","rpiercing",5],
+ [1000000,"stat","crit",0.5],
+ [10000000,"stat","frequency",1],
+ ]
+ },
+ #winter
+ "stompy":{
+ "name":"Stompy","speed":40,"charge":80,"hp":640000,"xp":600000,"attack":3600,"damage_type":"physical","respawn":36*60,"gold":80000,"range":64,"frequency":0.8,"aggro":0.2,
+ "achievements":[
+ [1,"stat","hp",50],
+ [100,"stat","mp",20],
+ [1000,"stat","speed",0.25],
+ [10000,"stat","range",0.5],
+ [100000,"stat","mp",50],
+ [1000000,"stat","frequency",1],
+ [10000000,"stat","attack",200],
+ ]
+ },
+ "arcticbee":{
+ "name":"Arctic Bee","speed":12,"hp":1600,"xp":1800,"attack":64,"damage_type":"physical","respawn":1,"gold":60,"range":20,"frequency":0.6,"aggro":1,"aa":1,"rage":0.05,
+ "phresistance":50,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","resistance",1],
+ [10000,"stat","int",1],
+ [100000,"stat","dex",2],
+ [1000000,"stat","resistance",5],
+ [10000000,"stat","range",2.5],
+ ]
+ },
+ "wolf":{
+ "name":"White Wolf","speed":24,"charge":152,"hp":48000,"xp":48800,"attack":480,"damage_type":"physical","respawn":12,"gold":480,"range":20,"frequency":0.8,"aggro":1,"rage":1,"resistance":200,"armor":300,
+ "achievements":[
+ [1,"stat","hp",20],
+ [100,"stat","mp",20],
+ [1000,"stat","for",1],
+ [10000,"stat","resistance",5],
+ [100000,"stat","vit",3],
+ [1000000,"stat","xp",1],
+ [10000000,"stat","speed",2],
+ ],
+ #"supporter":True,
+ },
+ "wolfie":{
+ "name":"Dark Hound","speed":24,"charge":52,"hp":19200,"xp":16400,"attack":320,"damage_type":"physical","respawn":12,"gold":360,"range":20,"frequency":0.8,"aggro":1,"rage":1,"resistance":100,"armor":200,
+ "achievements":[
+ [1,"stat","hp",20],
+ [100,"stat","mp",20],
+ [1000,"stat","hp",30],
+ [10000,"stat","str",1],
+ [100000,"stat","vit",1],
+ [1000000,"stat","armor",5],
+ [10000000,"stat","mp",500],
+ ]
+ },
+ "boar":{
+ "name":"Wild Boar","speed":20,"charge":40,"hp":12000,"xp":10800,"attack":240,"damage_type":"physical","respawn":10,"gold":240,"range":24,"frequency":0.7,"aggro":1,"rage":1,"armor":100,
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","str",1],
+ [100000,"stat","int",2],
+ [1000000,"stat","vit",5],
+ [10000000,"stat","armor",12],
+ ]
+ },
+ "iceroamer":{
+ "name":"Water Spirit","speed":20,"hp":3600,"xp":4200,"attack":120,"damage_type":"magical","respawn":2,"gold":180,"range":100,"frequency":0.7,"aggro":0.2,"reflection":8,"rpiercing":320,"evasion":10,"hit":"explode_p",
+ "phresistance":50,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","vit",1],
+ [10000,"stat","int",1],
+ [100000,"stat","for",2],
+ [1000000,"stat","reflection",0.5],
+ [10000000,"stat","rpiercing",20],
+ ]
+ },
+ "fireroamer":{
+ "name":"Fire Spirit","speed":24,"hp":84000,"xp":64200,"attack":320,"damage_type":"magical","respawn":2,"gold":180,"range":280,"frequency":1.2,"aggro":0.2,"rpiercing":320,"evasion":4,"resistance":320,"armor":120,"hit":"explode_p",
+ "phresistance":50,
+ "difficulty":1.1,
+ "abilities":{"burn":{"unlimited":True,"attr0":100}},
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",10],
+ [1000,"stat","vit",1],
+ [10000,"stat","int",1],
+ [100000,"stat","for",2],
+ [1000000,"stat","evasion",0.5],
+ [10000000,"stat","apiercing",20],
+ ]
+ },
+ "bbpompom":{
+ "name":"Pom Pom","speed":18,"hp":6400,"xp":6000,"attack":320,"damage_type":"magical","respawn":4,"gold":280,"range":280,"frequency":0.6,"aggro":0.2,"resistance":160,"hit":"explode_p",
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","int",1],
+ [100000,"stat","int",2],
+ [1000000,"stat","resistance",5],
+ [10000000,"stat","range",2],
+ ]
+ },
+ #underground
+ "prat":{
+ "name":"Vampire Rat","speed":12,"charge":86,"hp":9200,"xp":7600,"attack":320,"armor":160,"damage_type":"physical","respawn":4,"range":32,"frequency":1.6,"aggro":1,"rage":0.4,"lifesteal":120,
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","dex",1],
+ [100000,"stat","attack",5],
+ [1000000,"stat","vit",5],
+ [10000000,"stat","lifesteal",1.25],
+ ]
+ },
+ "pppompom":{
+ "name":"Pom Pom","speed":18,"hp":64000,"xp":62400,"attack":920,"damage_type":"physical","respawn":4,"gold":280,"range":300,"frequency":1.32,"aggro":0.2,"resistance":480,"hit":"explode_p",
+ "difficulty":1.20,
+ "poisonous":True,
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","int",1],
+ [100000,"stat","int",2],
+ [1000000,"stat","resistance",5],
+ [10000000,"stat","range",2],
+ ]
+ },
+ "oneeye":{
+ "name":"One Eye","speed":24,"hp":420000,"xp":582000,"armor":160,"resistance":160,"attack":480,"damage_type":"physical","respawn":4,"gold":32,"range":40,"frequency":3,"aggro":1,"rage":0,
+ "phresistance":30,
+ "difficulty":1.20,
+ "abilities":{
+ "stone":{"cooldown":6400}
+ },
+ "achievements":[
+ [1,"stat","for",1],
+ [100,"stat","mp",25],
+ [1000,"stat","attack",5],
+ [10000,"stat","int",1],
+ [100000,"stat","resistance",5],
+ [1000000,"stat","frequency",1],
+ [10000000,"stat","attack",50],
+ ]
+ },
+ #halloween2
+ "mummy":{
+ "name":"Mummy","speed":16,"charge":96,"hp":12000,"xp":16000,"attack":420,"damage_type":"physical","respawn":24,"gold":100,"range":48,"frequency":1.2,"aggro":1.5,"rage":1.5,
+ "difficulty":2,
+ "achievements":[
+ [1,"stat","hp",20],
+ [100,"stat","vit",1],
+ [1000,"stat","str",1],
+ [10000,"stat","attack",5],
+ [100000,"stat","speed",0.5],
+ [1000000,"stat","attack",25],
+ [10000000,"stat","evasion",1],
+ ]
+ },
+ "nerfedmummy":{
+ "skin":"mummy","name":"Mummy","speed":96,"charge":96,"hp":1600,"xp":1800,"attack":240,"damage_type":"physical","respawn":24,"gold":100,"range":48,"frequency":0.9,"aggro":1,"rage":1,
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","hp",30],
+ [10000,"stat","vit",1],
+ [100000,"stat","vit",2],
+ [1000000,"stat","crit",0.5],
+ [10000000,"stat","manasteal",0.25],
+ ]
+ },
+ "booboo":{
+ "name":"Boo Boo","speed":16,"charge":96,"hp":8000,"xp":12000,"attack":220,"damage_type":"pure","respawn":48,"gold":30,"range":420,"frequency":1.2,"aggro":1.5,"aa":1,"rage":1.5,
+ "phresistance":50,
+ "difficulty":1.25,
+ "achievements":[
+ [1,"stat","mp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","for",1],
+ [100000,"stat","str",2],
+ [1000000,"stat","speed",0.5],
+ [10000000,"stat","range",2.25],
+ ]
+ },
+ "pinkgoblin":{
+ "name":"Pink Goblin","speed":40,"hp":420000,"xp":460000,
+ "attack":2400,
+ "damage_type":"magical","respawn":40,"gold":16000,"range":240,"frequency":0.4,"aggro":0,"hit":"explode_p","prefix":"","resistance":350,"armor":200,
+ "abilities":{"self_healing":{"heal":96000,"cooldown":4000}},
+ "difficulty":2,
+ "slots":{"mainhand":{"name":"pmace","level":8}},
+ "achievements":[
+ [1000,"stat","mp",10],
+ [2000,"stat","vit",1],
+ [10000,"stat","for",1],
+ [100000,"stat","str",2],
+ [1000000,"stat","speed",0.5],
+ [10000000,"stat","range",1.25],
+ ]
+ },
+ "stoneworm":{
+ "name":"Stone Worm","speed":12,"charge":46,"hp":2200,"xp":2400,"attack":360,"damage_type":"physical","respawn":1,"gold":64,"range":20,"frequency":0.6,"aggro":1,"rage":1,"apiercing":800,"balance":"Spadar",
+ "achievements":[
+ [10,"stat","hp",10],
+ [100,"stat","mp",20],
+ [1000,"stat","hp",30],
+ [10000,"stat","for",1],
+ [100000,"stat","for",2],
+ [1000000,"stat","apiercing",5],
+ [10000000,"stat","resistance",10],
+ ]
+ },
+ "mrgreen":{
+ "name":"Mr. Green","speed":40,"charge":90,"hp":36000000,"xp":48000000,"attack":1200,"damage_type":"physical",
+ "respawn":94*60,
+ "gold":16000,"range":620,"frequency":1.6,"aggro":1,"rage":1,"apiercing":320,"resistance":900,"cooperative":True,"announce":"#256943",
+ "cbuff":[[60,"halloween0"],[70,"halloween1"],[200,"halloween2"]],
+ "slots":{"mainhand":{"name":"gbow","level":10}},
+ "achievements":[
+ [1,"stat","hp",10],
+ [10,"stat","mp",20],
+ [100,"stat","vit",1],
+ [1000,"stat","dex",1],
+ [10000,"stat","armor",10],
+ [100000,"stat","rpiercing",10],
+ [1000000,"stat","manasteal",0.32],
+ ]
+ },
+ "slenderman":{
+ "name":"Slenderman","speed":280,"hp":66666,"xp":4800,"attack":3600,"damage_type":"physical","respawn":60*10,"gold":16000,"range":52,"frequency":0.3,"aggro":0.05,
+ "reflection":96,
+ "immune":True,
+ "special":True,
+ "cooperative":True,
+ "phresistance":95,
+ "announce":"#3D3C81",
+ "cbuff":[[60,"halloween0"],[70,"halloween1"],[200,"halloween2"]],
+ "achievements":[
+ [1,"stat","hp",10],
+ [10,"stat","mp",10],
+ [100,"stat","for",1],
+ ]
+ },
+ "mrpumpkin":{
+ "name":"Mr. Pumpkin","speed":40,"hp":36000000,"xp":48000000,"attack":1200,"damage_type":"magical",
+ "respawn":54*60,
+ "phresistance":30,
+ "gold":16000,"range":520,"frequency":1,"aggro":0.05,"hit":"explode_c","cooperative":True,"announce":"#FD8940",
+ "cbuff":[[60,"halloween0"],[70,"halloween1"],[200,"halloween2"]],
+ "slots":{"mainhand":{"name":"oozingterror","level":8}},
+ "achievements":[
+ [1,"stat","hp",10],
+ [10,"stat","mp",20],
+ [100,"stat","vit",1],
+ [1000,"stat","str",1],
+ [10000,"stat","resistance",10],
+ [100000,"stat","apiercing",10],
+ [1000000,"stat","crit",1],
+ ]
+ },
+ "greenjr":{
+ "name":"Green Jr.","speed":60,"charge":120,"hp":4200,"xp":120000,"attack":30,"damage_type":"physical",
+ "cbuff":[[60,"halloween0"],[70,"halloween1"],[200,"halloween2"]],
+ "respawn":480 and 12*72*60, #sprocess_game_data
+ "gold":16000,"range":80,"frequency":20,"aggro":1,"rage":1,"rpiercing":420,"resistance":400,"evasion":40,"reflection":4,
+ "difficulty":2,
+ "achievements":[
+ [1,"stat","mp",10],
+ [10,"stat","vit",1],
+ [100,"stat","armor",10],
+ [1000,"stat","resistance",15],
+ [10000,"stat","for",3],
+ [100000,"stat","frequency",1],
+ [1000000,"stat","speed",1],
+ ]
+ },
+ "jr":{
+ "name":"Jr.","speed":40,"charge":90,"hp":3200,"xp":80000,"attack":10,"damage_type":"magical",
+ "cbuff":[[60,"halloween0"],[70,"halloween1"],[200,"halloween2"]],
+ "respawn":480 and 6*72*60, #sprocess_game_data
+ "gold":6000,"range":30,"frequency":20,"aggro":1,"rage":1,"resistance":400,"evasion":80,
+ "difficulty":2,
+ "achievements":[
+ [1,"stat","mp",10],
+ [10,"stat","vit",1],
+ [100,"stat","resistance",10],
+ [1000,"stat","armor",8],
+ [10000,"stat","attack",20],
+ [100000,"stat","luck",1],
+ [1000000,"stat","speed",1],
+ ]
+ },
+
+ #tests
+ "chestm":{"name":"Angry Chest","speed":4,"hp":6400,"xp":6000,"attack":320,"damage_type":"magical","respawn":4,"gold":280,"range":280,"frequency":0.6,"aggro":0.2,"resistance":160,"hit":"explode_p","hide":True},
+
+ #prototypes
+ "plantoid":{
+ "name":"Sprawling","speed":20,"hp":120000,"xp":96000,"attack":640,"damage_type":"physical","respawn":18,"gold":1,"range":80,"frequency":1.2,"aggro":0.2,"armor":160,"resistance":190,
+ "achievements":[
+ [1,"stat","mp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","int",1],
+ [10000,"stat","mp",40],
+ [100000,"stat","dex",1],
+ [1000000,"stat","resistance",5],
+ [10000000,"stat","mp",250],
+ ]
+ },
+ "icegolem":{
+ "name":"Ice Golem","speed":12,"charge":48,"hp":16000000,"xp":92000000,"attack":2400,"damage_type":"physical","respawn":-1,"gold":1,"range":64,"frequency":1.2,"aggro":0.2,"resistance":800,"armor":800,
+ "announce":True,
+ "special":True,
+ "phresistance":40,
+ "difficulty":12,
+ "cooperative":True,
+ "abilities":{"multi_freeze":{"cooldown":2000,"damage":2000}},
+ "achievements":[
+ [1,"stat","hp",10],
+ [10,"stat","hp",30],
+ ]
+ },
+ "ent":{
+ "name":"Ent","speed":12,"charge":48,"hp":8000000,"xp":9200000,"attack":3600,"damage_type":"physical","respawn":12,"gold":1,"range":64,"frequency":1.2,"aggro":0.2,"resistance":100,"armor":100,
+ "phresistance":15,
+ "abilities":{
+ "mtangle":{"cooldown":3200}
+ },
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","hp",30],
+ [1000,"stat","vit",1],
+ [10000,"stat","for",3],
+ [100000,"stat","resistance",10],
+ [1000000,"stat","attack",25],
+ [10000000,"stat","speed",2],
+ ]
+ },
+ "welemental":{"name":"Water Elemental","speed":20,"hp":80000,"xp":10,"attack":1800,"damage_type":"physical","respawn":1,"gold":1,"range":80,"frequency":1.2,"aggro":0.2,"evasion":80},
+ "felemental":{"name":"Fire Elemental","speed":20,"hp":80000,"xp":10,"attack":1800,"damage_type":"physical","respawn":1,"gold":1,"range":80,"frequency":1.2,"aggro":0.2,"evasion":80},
+ "nelemental":{"name":"Nature Elemental","speed":20,"hp":80000,"xp":10,"attack":1800,"damage_type":"physical","respawn":1,"gold":1,"range":80,"frequency":1.2,"aggro":0.2,"evasion":80},
+ "eelemental":{"name":"Earth Elemental","speed":20,"hp":80000,"xp":10,"attack":1800,"damage_type":"physical","respawn":1,"gold":1,"range":80,"frequency":1.2,"aggro":0.2,"evasion":80},
+
+ #misc
+ "greenfairy":{
+ "phresistance":70,
+ "name":"Fairy","speed":10,"hp":3600000,"xp":2000000,"attack":3000,"damage_type":"magical","respawn":0,"gold":1000,"range":999999,"frequency":100,"aggro":0,"hit":"explode_c","aa":1,
+ "achievements":[
+ [10,"stat","luck",2],
+ ],
+ },
+ "redfairy":{
+ "phresistance":70,
+ "name":"Fairy","speed":10,"hp":4800000,"xp":2000000,"attack":4000,"damage_type":"magical","respawn":0,"gold":1000,"range":999999,"frequency":100,"aggro":0,"hit":"explode_c","aa":1,
+ "achievements":[
+ [10,"stat","gold",2],
+ ],
+ "abilities":{"heal":{"heal":20000,"cooldown":1000}}
+ },
+ "bluefairy":{
+ "phresistance":70,
+ "name":"Fairy","speed":10,"hp":4000000,"xp":2000000,"attack":2400,"damage_type":"magical","respawn":0,"gold":1000,"range":999999,"frequency":100,"aggro":0,"hit":"explode_c","aa":1,
+ "achievements":[
+ [10,"stat","xp",2],
+ ],
+ },
+ "rudolph":{
+ "name":"Reindeer","speed":24,"hp":12000000,"xp":2000000,"attack":1600,"damage_type":"magical","respawn":60*60,"gold":10000,"range":999999,"frequency":10,"aggro":0,"hit":"explode_c","prefix":"the",
+ "resistance":1200,
+ "armor":1200,
+ "achievements":[
+ [100,"stat","for",2],
+ [1000,"stat","for",2],
+ ]
+ },
+ "grinch":{
+ "name":"Grinch","speed":40,"hp":24000000,"xp":12000,
+ "humanoid":True,
+ "cooperative":True,
+ "global":True, #chest spawns on player
+ "attack":9,
+ "damage_type":"magical","respawn":12*60*60,"gold":16000,"range":120,"frequency":0.5,"aggro":0,"hit":"explode_c","prefix":"","resistance":150,
+ "special":True,"passive":True,"abilities":{"portal":{"cooldown":0},"self_healing":{"heal":8008,"cooldown":8008}},"goldsteal":1,
+ "phresistance":90,
+ #"good":True,"attack":1200,
+ "slots":{"mainhand":{"name":"ornamentstaff","level":13}},
+ "announce":"#C82F17",
+ "achievements":[
+ [1,"stat","hp",20],
+ [100,"stat","fzresistance",1],
+ [1000,"stat","pnresistance",1],
+ ]
+ },
+
+
+ #killmany
+ "goldenbat":{
+ "name":"Golden Bat","speed":24,"hp":24000,"xp":20000,"attack":50,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":0.7,"aggro":0.3,"aa":1,
+ "difficulty":100,
+ "phresistance":70,
+ "explanation":"Spawns in Cave of Darkness around every 80,000 Bat spawns",
+ "achievements":[
+ [1,"stat","gold",1],
+ [10,"stat","luck",1],
+ [100,"stat","gold",1],
+ [1000,"stat","range",1],
+ [2000,"stat","frequency",1],
+ [5000,"stat","gold",5],
+ ]
+ },
+ "tinyp":{
+ "name":"Fairy","speed":24,"hp":5600,"xp":12000,"attack":240,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":5,"aggro":0.3,"aa":1,
+ "escapist":True,"roam":True,"cute":True,
+ "abilities":{"self_healing":{"heal":1200,"cooldown":10}},
+ "special":True,"immune":True,
+ "phresistance":98,
+ "achievements":[
+ [1,"stat","for",0.25],
+ [10,"stat","luck",0.5],
+ ],
+ },
+
+ #bosses
+ #"aqueen":{"name":"Arachnid Queen","speed":24,"hp":2400,"xp":2000,"attack":50,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":0.7,"aggro":0.3,"aa":1},
+
+ #specials
+ "tiger":{
+ "name":"Tiger","speed":24,"hp":12000,"xp":24800,"attack":960,"damage_type":"physical","respawn":30*60,"gold":480,"range":20,"frequency":0.8,"aggro":0,"rage":0,"reflection":100,"armor":540,
+ "announce":"#D65A3A",
+ "cute": True,
+ "explanation":"Legendary animal, rarely appears to players.",
+ "cooperative":True,
+ "avoidance":99,
+ "special":True,"immune":True,
+ "phresistance":60,
+ "drop_on_hit":True,
+ "peaceful":True,
+ "roam":True,
+ "achievements":[
+ [1,"stat","vit",1],
+ ],
+ #"supporter":True,
+ },
+ "goblin":{
+ "name":"Sneaky Goblin","speed":30,"hp":50,"xp":640000,"attack":0,"damage_type":"physical","respawn":-1,"gold":4000000,"range":2,"frequency":1,"aggro":0,"evasion":99.95,"reflection":99.95,"special":True,"immune":True,
+ "phresistance":30,
+ "achievements":[
+ [1,"stat","gold",2],
+ [100,"stat","xp",5],
+ [1000,"stat","gold",5],
+ [5000,"stat","reflection",2],
+ ]
+ },
+ "pinkgoo":{
+ "name":"Love Goo","speed":8,"hp":40,"xp":12000,"attack":100,"damage_type":"physical","respawn":60*60,"gold":10000,"range":20,"frequency":1,"aggro":0,"avoidance":98.0,"special":True,"immune":True,"1hp":True,"cooperative":True,
+ "phresistance":30,
+ "achievements":[
+ [10,"stat","vit",1],
+ [100,"stat","speed",0.5],
+ [1000,"stat","hp",200],
+ [10000,"stat","armor",10],
+ ]
+ },
+ "snowman":{
+ "name":"Snowman","speed":8,"hp":1200,"xp":12000,"attack":80,"damage_type":"physical","respawn":60*60,"gold":10000,"range":20,"frequency":1,"aggro":0,"special":True,"immune":True,"cooperative":True,"1hp":True,"announce":"#B1DCEF",
+ "s":{"fullguardx":{"ms":5*60*1000}},
+ "achievements":[
+ [10,"stat","mp",10],
+ [100,"stat","resistance",3],
+ [1000,"stat","resistance",5],
+ [10000,"stat","attack",5],
+ [100000,"stat","speed",1.75],
+ [1000000,"stat","luck",5],
+ ]
+ },
+ "dragold":{
+ "name":"Dragold","speed":22,"hp":12800000*2,"xp":12000000*2,"attack":800,"damage_type":"magical","respawn":3*60*60,"gold":10000,"range":320,"frequency":1,"aggro":0,"special":True,"cooperative":True,"announce":"#D7B717","armor":240,"resistance":320,
+ "s":{"fullguardx":{"ms":2*60*1000}},
+ "phresistance":65,
+ "abilities":{"multi_burn":{"cooldown":24000,"damage":4000}},
+ "achievements":[
+ [1,"stat","gold",1],
+ [10,"stat","for",0.5],
+ [20,"stat","luck",1],
+ ],
+ "projectile":"fireball",
+ },
+ "wabbit":{
+ "name":"Wabbit","speed":60,"hp":32000,"armor":180,"resistance":180,"xp":1000000,"attack":60,"damage_type":"physical","respawn":60*60,"gold":1000,"range":20,"frequency":1,"aggro":0,"avoidance":98.8,"special":True,"immune":True,"cooperative":True,"operator":True,"rbuff":"easterluck","s":{"fullguard":{"ms":5*60*1000}},
+ "phresistance":70,
+ "achievements":[
+ [1,"stat","xp",1],
+ [100,"stat","xp",1],
+ [1000,"stat","luck",1],
+ [5000,"stat","luck",1],
+ [10000,"stat","speed",0.75],
+ [100000,"stat","speed",1],
+ ]
+
+ },
+ "franky":{
+ "name":"Franky","speed":48,"charge":64,"hp":120000000,"xp":200000000,"attack":2910,"damage_type":"magical","hit":"explode_c","respawn":-1,"gold":10000,"range":948,"frequency":1.6,"aggro":1,"rage":0,"special":True,"cooperative":True,"spawns":[[200,"nerfedmummy"]],"announce":"#9D99EF",
+ "phresistance":70,
+ "humanoid":True,
+ "achievements":[
+ [1,"stat","for",1],
+ [100,"stat","attack",10],
+ [1000,"stat","attack",20],
+ [10000,"stat","frequency",1],
+ [100000,"stat","xp",2],
+ [1000000,"stat","range",1],
+ ]
+ },
+ "gredpro":{
+ "name":"Protector of Fire","speed":48,"charge":84,"hp":2400000,"xp":3200000,"attack":120,"damage_type":"magical","hit":"explode_c","respawn":10*60,"gold":10000,"range":948,"frequency":1.2,"aggro":1,"rage":0,
+ "slots":{"mainhand":{"name":"firestaff","level":12}},
+ "abilities":{"burn":{"unlimited":True,"attr0":100}},
+ },
+ "ggreenpro":{
+ "name":"Protector of Nature","speed":48,"charge":64,"hp":1600000,"xp":9600000,"attack":1120,"damage_type":"physical","hit":"explode_c","respawn":60*60,"gold":10000,"range":948,"frequency":3,"aggro":1,"rage":0,
+ "slots":{"mainhand":{"name":"woodensword","level":12}},
+ "abilities":{
+ "tangle":{"cooldown":1600},
+ "self_healing":{"heal":48000,"cooldown":2000},
+ },
+ },
+ "gbluepro":{
+ "name":"Protector of Frost","speed":48,"charge":84,"hp":3200000,"xp":7200000,"attack":9600,"damage_type":"magical","hit":"explode_c","respawn":5*60,"gold":10000,"range":948,"frequency":1.2,"aggro":1,"rage":0,
+ "cooperative":True,
+ "slots":{"mainhand":{"name":"froststaff","level":12}},
+ "abilities":{"multi_freeze":{"cooldown":4000,"damage":800}},
+ "article":"event-mae",
+ },
+ "gpurplepro":{
+ "name":"Protector of Darkness","speed":48,"charge":84,"hp":4300000,"xp":8200000,"attack":4893,"damage_type":"magical","hit":"explode_c","respawn":7*60,"gold":10000,"range":948,"frequency":2,"aggro":1,"rage":0,
+ "cooperative":True,
+ "slots":{"mainhand":{"name":"oozingterror","level":12}},
+ "abilities":{"putrid":{"curse":True,"poison":True}},
+ "article":"event-mae",
+ },
+ #crypt
+ "a1":{
+ "name":"Spike","speed":32,"charge":67,"hp":18700000,"xp":32000000,"difficulty":8,"attack":4240,"damage_type":"magical","respawn":-1,"gold":120000,"range":147,"frequency":1.2,"aggro":1,"rage":1,"roam":True,
+ "phresistance":10,
+ "armor":120,"resistance":260,
+ "slots":{"mainhand":{"name":"vstaff","level":10}},
+ "humanoid":True,
+ "spawns":[[200,"nerfedbat"]],
+ },
+ "a2":{
+ "name":"Bill","speed":32,"charge":96,"hp":420000,"xp":1200000,"difficulty":8,"attack":2240,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":1.4,"aggro":1,"rage":1,"roam":True,
+ "armor":220,"resistance":160,
+ "phresistance":15,
+ "slots":{"mainhand":{"name":"vdagger","level":9},"offhand":{"name":"vdagger","level":10}},
+ "abilities":{
+ "anger":{"cooldown":8000,"radius":300},
+ },
+ "poisonous":True,
+ "humanoid":True,
+ },
+ "a3":{
+ "name":"Lestat","speed":32,"charge":80,"hp":342000,"xp":9600000,"difficulty":8,"attack":1520,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":1.2,"aggro":1,"rage":1,"roam":True,
+ "phresistance":20,
+ "armor":220,"resistance":160,
+ "slots":{"mainhand":{"name":"vhammer","level":10},"offhand":{"name":"vhammer","level":10}},
+ "explosion":20,
+ "abilities":{
+ "anger":{"cooldown":8000,"radius":300}
+ },
+ "humanoid":True,
+ },
+ "a4":{
+ "name":"Orlok","speed":42,"charge":86,"hp":560000,"xp":1600000,"difficulty":8,"attack":720,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":1.5,"aggro":1,"rage":1,"roam":True,
+ "phresistance":25,
+ "armor":320,"resistance":160,
+ "slots":{"mainhand":{"name":"scythe","level":9}},
+ "humanoid":True,
+ "spawns":[[1600,"zapper0"]],
+ },
+ "a5":{
+ "name":"Elena","speed":32,"charge":76,"hp":230000,"xp":1200000,"difficulty":8,"attack":240,"damage_type":"magical","respawn":-1,"gold":120000,"range":135,"frequency":0.3,"aggro":1,"rage":1,"roam":True,
+ "phresistance":25,
+ "armor":60,"resistance":240,
+ "abilities":{
+ "healing":{"heal":66000,"cooldown":800}
+ },
+ "slots":{"mainhand":{"name":"lmace","level":10}},
+ "humanoid":True,
+ "supporter":True,
+ },
+ "a6":{
+ "name":"Marceline","speed":32,"charge":86,"hp":320000,"xp":880000,"difficulty":8,"attack":8960,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":2,"aggro":1,"rage":1,"roam":True,
+ "phresistance":30,
+ "armor":220,"resistance":120,
+ "slots":{"mainhand":{"name":"scythe","level":9}},
+ "abilities":{
+ "weakness_aura":{
+ "aura":True,
+ "condition":"weakness",
+ "radius":100,
+ "cooldown":4000,
+ }
+ },
+ "humanoid":True,
+ },
+ "a7":{
+ "name":"Lucinda","speed":32,"charge":72,"hp":720000,"xp":1200000,"difficulty":8,"attack":910,"damage_type":"magical","respawn":-1,"gold":120000,"range":135,"frequency":1.2,"aggro":1,"rage":1,"roam":True,
+ "phresistance":30,
+ "armor":50,"resistance":200,
+ "slots":{"mainhand":{"name":"oozingterror","level":10}},
+ "abilities":{
+ "dampening_aura":{"radius":300,"cooldown":180,"aura":True,"condition":"dampened"},
+ "mlight":{"cooldown":3000},
+ },
+ "humanoid":True,
+ },
+ "a8":{
+ "name":"Angel","speed":32,"charge":76,"hp":560000,"xp":1200000,"difficulty":8,"attack":2680,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":4,"aggro":1,"rage":1,"roam":True,
+ "phresistance":35,
+ "armor":220,"resistance":220,
+ "slots":{"mainhand":{"name":"pinkie","level":10},"offhand":{"name":"pinkie","level":10}},
+ "abilities":{
+ "curse_aura":{"radius":300,"cooldown":4000,"aura":True,"condition":"cursed"},
+ },
+ "humanoid":True,
+ },
+ "vbat":{
+ "phresistance":70,
+ "name":"Vampireling","speed":24,"charge":84,"hp":156000,"xp":720000,"difficulty":17,"attack":1240,"damage_type":"physical","respawn":-1,"gold":120000,"range":35,"frequency":1.56,"aggro":0.3,"rage":0.1,"aa":1,
+ },
+ #mage
+ "xmagefz":{
+ "hide":True,
+ "immune":True,
+ "phresistance":20,
+ "name":"Mage","speed":24,"charge":84,"hp":4800000,"xp":7200000,"attack":1640,"damage_type":"magical","respawn":0,"gold":120000,"range":135,"frequency":1.26,"aggro":1.8,"rage":1.8,
+ "armor":120,"resistance":360,
+ "respawn_as":"xmagefi",
+ "slots":{"mainhand":{"name":"vstaff","level":13}},
+ "difficulty":0,
+ "abilities":{
+ "deepfreeze":{"cooldown":6000,"radius":300},
+ },
+ },
+ "xmagefi":{
+ "hide":True,
+ "immune":True,
+ "phresistance":35,
+ "name":"Mage","speed":24,"charge":84,"hp":5600000,"xp":1440000,"difficulty":0,"attack":2240,"damage_type":"magical","respawn":0,"gold":120000,"range":135,"frequency":1.46,"aggro":1.8,"rage":1.8,
+ "armor":220,"resistance":360,
+ "slots":{"mainhand":{"name":"firestaff","level":13}},
+ "respawn_as":"xmagen",
+ "abilities":{
+ "anger":{"cooldown":8000,"radius":300},
+ "multi_burn":{"cooldown":4000,"damage":4000},
+ },
+ },
+ "xmagen":{
+ "hide":True,
+ "immune":True,
+ "phresistance":50,
+ "name":"Mage","speed":24,"charge":84,"hp":6400000,"xp":21600000,"difficulty":0,"attack":2440,"damage_type":"magical","respawn":0,"gold":120000,"range":135,"frequency":1.66,"aggro":1.8,"rage":1.8,
+ "reflection":30,
+ "armor":320,"resistance":360,
+ "slots":{"mainhand":{"name":"mushroomstaff","level":13}},
+ "respawn_as":"xmagex",
+ "poisonous":True,
+ "abilities":{
+ "self_healing":{"heal":4800,"cooldown":2000},
+ "mtangle":{"cooldown":3200},
+ },
+
+ },
+ "xmagex":{
+ "name":"Dark Mage","speed":24,"charge":84,"hp":7200000,"xp":28800000,"difficulty":64,"attack":10640,"damage_type":"magical","respawn":-1,"gold":120000,"range":135,"frequency":1.56,"aggro":1.8,"rage":1.8,
+ "phresistance":65,
+ "armor":360,"resistance":420,
+ "immune":True,
+ "slots":{"mainhand":{"name":"oozingterror","level":13}},
+ "abilities":{
+ "anger":{"cooldown":8000,"radius":300},
+ "warpstomp":{"cooldown":4000,"radius":160,"stun":1500},
+ },
+ "achievements":[
+ [1,"stat","fzresistance",1],
+ [5,"stat","firesistance",1],
+ [10,"stat","phresistance",1],
+ [100,"stat","frequency",1],
+ [1000,"stat","xp",2],
+ [10000,"stat","gold",2],
+ ]
+ },
+ #cyberland
+ "mechagnome":{
+ "name":"Mech-a Gnome","speed":1,"charge":120,"hp":164000,"xp":80000,"attack":48,"damage_type":"physical","respawn":480,"gold":6000,"range":30,"frequency":4,"aggro":0,"rage":0,"resistance":600,"armor":600,"abilities":{"portal":{"cooldown":0}},
+ "achievements":[
+ [1,"stat","hp",10],
+ [100,"stat","hp",20],
+ [1000,"stat","vit",1],
+ [10000,"stat","dex",1],
+ [100000,"stat","attack",5],
+ [1000000,"stat","vit",5],
+ [10000000,"stat","lifesteal",1.25],
+ ]
+ },
+
+ #humanoids
+ "d_wiz":{"name":"Dark Wizard","skin":"shadow","speed":12,"charge":90,"hp":100000,"xp":10000,"attack":5200,"damage_type":"magical","respawn":6000,"gold":20,"range":240,"frequency":2,"aggro":1,
+ "slots":{"mainhand":{"name":"oozingterror","level":13}},"abilities":{"self_healing":{"heal":4800,"cooldown":2000}},
+ "unlist":True,"armor":560,"resistance":920,
+ },
+
+ #targets
+ "target":{"name":"Target Automatron","speed":12,"hp":50000,"xp":1000,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":2,"humanoid":True,"phresistance":50,},
+ "target_a500":{"name":"Target Automatron","speed":12,"hp":50000,"xp":1000,"armor":500,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":0,"humanoid":True,"immune":True},
+ "target_a750":{"name":"Target Automatron","speed":12,"hp":50000,"xp":1000,"armor":750,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":0,"humanoid":True,},
+ "target_r500":{"name":"Target Automatron","speed":12,"hp":50000,"xp":1000,"resistance":500,"evasion":50,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":0,"humanoid":True,},
+ "target_r750":{"name":"Target Automatron","speed":36,"hp":50000,"xp":1000,"resistance":750,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":0,"abilities":{"portal":{"cooldown":0}},"humanoid":True,},
+ "target_ar900":{
+ "name":"Target Automatron","speed":12,"hp":50000,"xp":1000,"resistance":900,"armor":900,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":0,
+ "achievements":[
+ [100,"stat","for",1],
+ ],
+ "humanoid":True,
+
+ # "abilities":{
+ # "deepfreeze":{"cooldown":6000,"radius":300},
+ # },
+ },
+ "target_ar500red":{"name":"Target Automatron","speed":12,"hp":500000,"xp":1000,"resistance":500,"armor":500,"reflection":50,"evasion":50,"dreturn":50,"attack":0,"damage_type":"physical","respawn":0,"gold":20,"range":1,"frequency":0.1,"aggro":0,"stationary":True,"orientation":1,"abilities":{"self_healing":{"heal":100000,"cooldown":10000}},"humanoid":True,},
+
+ #POSITIVE
+
+
+
+ #pets
+ "puppy1":{"name":"Puppy","speed":16,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "puppy2":{"name":"Puppy","speed":16,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "puppy3":{"name":"Puppy","speed":16,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "puppy4":{"name":"Puppy","speed":16,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "kitty1":{"name":"Kitty","speed":14,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "kitty2":{"name":"Kitty","speed":14,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "kitty3":{"name":"Kitty","speed":14,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+ "kitty4":{"name":"Kitty","speed":14,"charge":12,"hp":100,"xp":-500,"attack":5,"damage_type":"physical","respawn":6000,"gold":20,"range":15,"frequency":0.4,"aggro":0,"aa":0,"cute":True},
+
+ #traps
+ "fieldgen0":{"trap":True,"hide":True,"name":"Field Generator","speed":0,"hp":6400,"armor":2200,"resistance":1600,"xp":0,"attack":0,"damage_type":"pure","respawn":-1,"range":0,"frequency":0,"aggro":0,"aa":1,
+ "abilities":{
+ "dampening_aura":{"radius":300,"cooldown":180,"aura":True,"condition":"dampened"},
+ "degen":{"amount":60,"cooldown":200},
+ },
+ },
+ "zapper0":{"trap":True,"hide":True,"name":"Zapper","speed":0,"hp":6400,"armor":2200,"resistance":1600,"xp":0,"attack":0,"damage_type":"pure","respawn":-1,"range":0,"frequency":0,"aggro":0,"aa":1,
+ "abilities":{
+ "zap":{"amount":1200,"pure":True,"cooldown":1000,"radius":300},
+ "degen":{"amount":20,"cooldown":200},
+ },
+ }
+
+}
+
+for m in ["puppy1","puppy2","puppy3","puppy3"]:
+ monsters[m]["pet"]={
+ "level":{
+ "speed":2,
+ "charge":3,
+ "attack":40,
+ "hp":300,
+ "armor":20,
+ "resistance":30,
+ "evasion":5,
+ },
+ "xp":1000,
+ "exponential":True,
+ "aggression":[10,100],
+ "passion":[50,100],
+ "courage":[80,100],
+ "obedience":[0,50],
+ "chatter":[20,100],
+ "brightness":1/100, #XP Rate
+ }
+
+monster_gold={
+
+}
+
+for name in monsters:
+ if not monsters[name].get("skin"): monsters[name]["skin"]=name
+ if not monsters[name].get("rage"): monsters[name]["rage"]=0
+ if not monsters[name].get("aggro"): monsters[name]["aggro"]=0
+ if not monsters[name].get("mp"): monsters[name]["mp"]=math.ceil(monsters[name]["hp"]*2/100)
+ monster_gold[name]=monsters[name].get("gold",1)
+ try: del monsters[name]["gold"]
+ except: pass
\ No newline at end of file
diff --git a/design/multipliers.py b/design/multipliers.py
new file mode 100644
index 0000000..304bb1a
--- /dev/null
+++ b/design/multipliers.py
@@ -0,0 +1,9 @@
+extra_shells=0
+multipliers={
+ "extra_shells":extra_shells,
+ "shells_to_gold":32000,
+ "buy_to_sell":0.6,
+ "secondhands_mult":2,
+ "secondhands_cash_mult":3,
+ "lostandfound_mult":4,
+}
\ No newline at end of file
diff --git a/design/npcs.py b/design/npcs.py
new file mode 100644
index 0000000..818b54d
--- /dev/null
+++ b/design/npcs.py
@@ -0,0 +1,938 @@
+# This Python file uses the following encoding: utf-8
+npcs={
+ "pots":{
+ "role":"merchant",
+ "items":[
+ "hpot0","mpot0","hpot1","mpot1",None,
+ None,None,None,None,None,
+ None,None,None,None,None,
+ None,None,None,None,None,
+ ],
+ "skin":"yellowlady",
+ "atype":"once",
+ "stopframe":1,
+ "says":"Oh, Hello",
+ "ignore":True,
+ },
+ "standmerchant":{
+ "role":"standmerchant",
+ "items":[
+ "stand0",None,None,"ghatb","ghatp",
+ None,None,None,None,None,
+ None,None,None,None,None,
+ None,None,None,None,"test_orb",
+ ],
+ "skin":"purplelady",
+ #"atype":"once",
+ #"stopframe":1,
+ "type":"fullstatic",
+ "cx":{"hat":"hat221"},
+ "says":"Huu Huu",
+ "color":"#3FEEA2",
+ "name":"Divian",
+ },
+ "pvptokens":{
+ "role":"pvptokens",
+ "skin":"pvptokens",
+ "token":"pvptoken",
+ "says":"Grrr",
+ "color":"#9C201C",
+ #"atype":"flow",
+ "stand":"wstand_texture",
+ "aspeed":"slow",
+ "name":"Gn. Spence",
+ "side_interaction":{"auto":True,"skin":"pknight","message":"These tokens of honor represent victory. Make sure to join all the PVP events and spend some time in PVP realms. Glorious!"},
+ },
+ "funtokens":{
+ "role":"funtokens",
+ "skin":"funtokens",
+ "token":"funtoken",
+ "says":"Hihihi",
+ "color":"#92D467",
+ "atype":"flow",
+ "stand":"standg_texture",
+ "aspeed":"slow",
+ "name":"Tricksy",
+ "side_interaction":{"auto":True,"skin":"ftokener","message":"Bring your fun tokens to me and I'll give you some exciting items!"},
+ },
+ "friendtokens":{
+ "role":"friendtokens",
+ "skin":"xxschar2h",
+ "token":"friendtoken",
+ "says":"Hihihi",
+ "color":"#92D467",
+ "atype":"flow",
+ "stand":"fstand_texture",
+ "aspeed":"slow",
+ "name":"Fvona",
+ "side_interaction":{"auto":True,"skin":"xxschar2h","message":"Invite your friends to Adventure Land to win some of these goodie goodies!"},
+ },
+ "shellsguy":{
+ "role":"shells",
+ "name":"Mr. Dworf",
+ "skin":"fancyd",
+ "type":"fullstatic",
+ "says":"Sup",
+ },
+ "monsterhunter":{
+ "role":"monstertokens",
+ "token":"monstertoken",
+ "name":"Daisy",
+ "skin":"daisy",
+ "type":"fullstatic",
+ "says":"Hi!",
+ "color":"#B4FAA0",
+ },
+ "mcollector":{
+ "role":"mcollector",
+ "quest":"mcollector",
+ "name":"Cole",
+ "skin":"proft",
+ "type":"fullstatic",
+ "says":"Hmm",
+ "color":"#67A464",
+ },
+ "thief":{
+ "role":"merchant",
+ "items":[
+ "licence",None,None,None,None,
+ None,None,None,None,None,
+ None,None,None,None,None,
+ None,None,None,"scroll3","cscroll3",
+ ],
+ "skin":"thief",
+ #"skin":"test_a",
+ "type":"fullstatic",
+ "says":"Careful",
+ "color":"#E7E2E7",
+ "name":"Crun",
+ },
+ "fancypots":{
+ "role":"merchant",
+ "items":[
+ "hpot0","mpot0","hpot1","mpot1",None,
+ None,None,None,None,None,
+ None,None,None,None,None,
+ None,None,None,None,None,
+ ],
+ "skin":"fancypots",
+ #"skin":"test_a",
+ "atype":"flow",
+ "says":"Woo. Hic.",
+ "color":"#E57636",
+ "name":"Ernis",
+ "side_interaction":{"auto":True,"skin":"potiongirl","message":"Hello there. Are you injured or in need of some potions? My family and I pride ourselves with having the best quality potions and elixirs around. Take as much as you need. *hic*"},
+ },
+ "tbartender":{
+ "role":"merchant",
+ "items":[
+ "whiskey","wine","ale",None,None,
+ "pico","blue",None,None,None,
+ "espresso",None,None,None,None,
+ None,None,None,None,"xshot",
+ ],
+ "skin":"showoffi",
+ "type":"fullstatic",
+ "says":"Hello there",
+ "color":"#EBECEE",
+ "name":"Jaqk",
+ "side_interaction":{"auto":True,"skin":"showoffi","message":"Hello there, partner! Care for a drink? Good luck on the games! Don't lose all your gold at once, heh."},
+ },
+ "wbartender":{
+ "role":"merchant",
+ "items":[
+ "hpot0","mpot0","hpot1","mpot1",None,
+ "elixirluck",None,None,None,None,
+ None,None,None,None,None,
+ None,None,None,None,None,
+ ],
+ "skin":"npc63",
+ "says":"Welcome!",
+ "color":"#67CCB2",
+ "type":"fullstatic",
+ "name":"Warin",
+ },
+ "scrolls":{
+ "role":"merchant",
+ "items":[
+ "scroll0","cscroll0","strscroll","intscroll","dexscroll",
+ "scroll1","cscroll1",None,None,None,
+ #None,None,None,None,None,
+ "scroll2","cscroll2",None,None,
+ ],
+ "skin":"scrolls",
+ "says":"Good Luck",
+ "name":"Lucas",
+ },
+ "secondhands":{
+ "role":"secondhands",
+ "skin":"blingbling",
+ "type":"fullstatic",
+ "says":"There's some good stuff in here",
+ "color":"#7E65D3",
+ "name":"Ponty",
+ "side_interaction":{"auto":True,"skin":"blingbling","message":"They sell them. I buy them. You buy them from me for higher prices. Win win. I win. Bling!"},
+ },
+ "rewards":{
+ "role":"rewards",
+ "skin":"marmor9h",
+ "cx":{
+ "head": "makeup107",
+ "hair": "hairdo518",
+ "face": "coolblueg",
+ "hat": "hat400"
+ },
+ "type":"fullstatic",
+ "says":"Rewards!",
+ "color":"#7E65D3",
+ "name":"Werdars",
+ },
+ "lostandfound":{
+ "role":"lostandfound",
+ "skin":"goblin",
+ "type":"fullstatic",
+ "says":"Finders keepers",
+ "color":"#7E65D3",
+ "name":"Ron",
+ },
+ "holo":{
+ "role":"resort",
+ "skin":"holo",
+ "type":"fullstatic",
+ "says":u"△ ▽ ▲ ▼",
+ "color":"#EBECEE",
+ "name":"Z",
+ },
+ "tavern":{
+ "role":"tavern",
+ "skin":"showoffi",
+ "type":"fullstatic",
+ "says":"Hi",
+ "color":"#EBECEE",
+ "name":"Jaqk",
+ },
+ "pete":{
+ "name":"Pete",
+ "role":"petkeeper",
+ "skin":"lionsuit",
+ "type":"fullstatic",
+ "says":"Purr",
+ "color":"#EBECEE",
+ },
+ "guard":{
+ "name":"Guard",
+ "role":"guard",
+ "says":"...",
+ "skin":"thehelmet",
+ "type":"fullstatic",
+ },
+ "ship":{
+ "role":"ship",
+ "skin":"ship",
+ "says":"Ahoy",
+ "aspeed":"slower",
+ "atype":"flow",
+ },
+ "newyear_tree":{
+ "role":"newyear_tree",
+ "skin":"newyear_tree",
+ "says":"*Tin* *Tin* *Tin* *Tin*",
+ "aspeed":"fast",
+ "atype":"flow",
+ "color":"#B7161F",
+ "name":"New Year Tree",
+ },
+ "lotterylady":{
+ "role":"lottery",
+ "skin":"llady",
+ "type":"fullstatic",
+ "says":"Hi Dear",
+ "color":"#DF5AC5",
+ "name":"Rose",
+ },
+ "mistletoe":{
+ "role":"quest",
+ "quest":"mistletoe",
+ "skin":"pink",
+ "type":"fullstatic",
+ "says":"Uhhh",
+ "color":"#E376E5",
+ "name":"Faith",
+ },
+ "ornaments":{
+ "role":"quest",
+ "quest":"ornament",
+ "skin":"splithair",
+ "type":"fullstatic",
+ "says":"Hmm. Hmm. Hmm.",
+ "color":"#E56D39",
+ "name":"Jayson",
+ },
+ "santa":{
+ "role":"santa",
+ "quest":"candycane",
+ "skin":"santa",
+ "says":"Ho Ho Ho",
+ "color":"#DF2A2F",
+ "name":"Santa",
+ },
+ "witch":{
+ "role":"witch",
+ "quest":"witch",
+ "skin":"brewingwitch",
+ "says":"Brew Brew Brew",
+ "color":"#AF6AE2",
+ "aspeed":"slow",
+ "name":"Witch",
+ },
+ "jailer":{
+ "role":"jailer",
+ "skin":"thehelmet",
+ "type":"fullstatic",
+ "says":"Tu-tu-tu",
+ "color":"#62C3DF",
+ "name":"Jailord",
+ },
+ "leathermerchant":{
+ "role":"quest",
+ "quest":"leather",
+ "skin":"lmerchant",
+ "type":"fullstatic",
+ "says":"Have leathers?",
+ "color":"#6E4430",
+ "name":"Landon",
+ },
+ "gemmerchant":{
+ "role":"quest",
+ "quest":"gemfragment",
+ "skin":"gemmerchant",
+ "type":"fullstatic",
+ "says":"Bling",
+ "color":"#A058DF",
+ "name":"Mine Heathcliff",
+ },
+ "fisherman":{
+ "role":"quest",
+ "quest":"seashell",
+ "skin":"fisherman",
+ "type":"fullstatic",
+ "says":"Beautiful",
+ "color":"#429DDF",
+ "name":"Tristian",
+ },
+ "pwincess":{
+ "role":"quest",
+ "quest":"lostearring",
+ "skin":"pwincess",
+ "type":"fullstatic",
+ "says":"eek",
+ "color":"#FECDF7",
+ "name":"Wynifreed",
+ },
+ "firstc":{
+ "role":"companion",
+ "says":["I've heard Goo's drop Amulets.","I'm strictly on a goo-only diet."],
+ "skin":"lady1",
+ "type":"fullstatic",
+ },
+ "pvpblocker":{
+ "role":"blocker",
+ "says":"I will leave when there are* 4 people around.",
+ "skin":"thehelmet",
+ "type":"fullstatic",
+ },
+ "pvp":{
+ "role":"pvp_announcer",
+ "name":"Ace",
+ "allow":False,
+ "speed":40,
+ "hp":5000,
+ "skin":"thehelmet",
+ "type":"fullstatic",
+ },
+ "bean":{
+ "role":"events",
+ "name":"Bean",
+ "allow":False,
+ "speed":30,
+ "hp":3200,
+ "skin":"lionsuit",
+ "type":"fullstatic",
+ "moving":True,
+ },
+ "citizen0":{
+ "name":"Kane", #can't change this name, hardcoded to server_loot
+ "role":"citizen",
+ "skin":"greencap",
+ "type":"fullstatic",
+ "seek":"thrill",
+ "says":"Hello",
+ "speed":30,
+ #"speed":3200,
+ "hp":3200,
+ "delay":1200,
+ #"delay":0,
+ "level":12,
+ "says":["Heyoo","Greetings","I want a Puppy!","I want a Kitten!","Sup","Nice day","I wonder why everyone's sitting on my head all of a sudden ..."],
+ "interaction":["Hey There! This town is the safest place around. Outside can be dangerous.","Heyo, I don't understand how those shop owners can just stand around all day. I got to be moving. Kind of restless.","Just finished school and I've got to go get a real job now. I might become an adventurer since they seem to make a lot of money.","A friend of mine said the frog thingies in the beach drop some old money or sth like that."],
+ "aura":{
+ "luck":200,
+ },
+ },
+ "citizen1":{
+ "name":"Kilgore",
+ "role":"citizen",
+ "skin":"fxrogue",
+ "type":"fullstatic",
+ "says":"Grrrr",
+ "speed":40,
+ "hp":13200,
+ "delay":1200,
+ "steps":12, #defaultis 40, the walking multiplier
+ "level":120,
+ "says":["What is your name","Bartender give me your strongest liquor","How are you stranger","I wonder what my wife is doing at home","This inns food isn't as good homemade","Don't buy the food here","Do I smell","Good day","Greetings","Hello Stranger","Welcome","Its warm in here","*rubs beard*","Id like a beer","What beer should I buy","I need to rent a room","This place is pretty nice","Hi there"],
+ "interaction":["If you don't have a beer in your hand then what are you doing in here!?","Sit down and tell me a tale!","If you can't handle the cold then stay inside.. not saying I can't handle the cold.."],
+ },
+ "citizen2":{
+ "name":"Stewart",
+ "role":"citizen",
+ "skin":"oldcitizen",
+ "type":"fullstatic",
+ "says":["Freaking youngens","Go away - Kill some monsters","Stop","Someone needs to fix this place up","I don't have time for this","I need to go take a nap","Uhhh","Mmmehh","Ugg","Noob","Young yipper snappers"],
+ "speed":10,
+ "hp":2400,
+ "delay":12000,
+ "level":32,
+ "interaction":["Ehh. Back in my day we didn't have all these fancy additions in town, we had the essentials and that's it."],
+ },
+ "citizen3":{
+ "name":"Reny",
+ "role":"citizen",
+ "skin":"renaldo",
+ "type":"fullstatic",
+ "says":["Do you even lift bro","Broooo","Yah I work out","Sup","I need to buy some protein","Lap 203","Grind 24/7 all day everyday","You like my headband","Where are my shoes at","Where is the gym at","Nice day to work out","Wanna work out","Red headband for the win","Winners are not losers and I'm a winner","No I never give up"],
+ "speed":55,
+ "hp":3200,
+ "delay":3600,
+ "level":32,
+ "interaction":["I Grind 24 hours a day! 7 days a week! Never Stop! Never Give up! Always Training!!","My body fat ratio is just 18%. Can you believe it? Yes!","Do you even lift Bro.","Hi, I do laps around this town all the time. Gotta stay in shape."],
+ },
+ "citizen4":{
+ "name":"Angel",
+ "role":"citizen",
+ "skin":"angel",
+ "type":"fullstatic",
+ "seek":"gold",
+ "says":["Ohh look who walked into my life","Single and ready to mingle","No um I don't own a shop","Such a nice town","*fixes dress*","*gets flustered*","Would you like a potion sorry","Ohh look who walked into my life","Single and ready to mingle","No um I don't own a shop","Such a nice town","*fixes dress*","*gets flustered*","Would you like a potion sorry","No potion for you","Stop cat calling","*rolls eyes*Hey sweetie","Nice day","Sweet thing are you lost","Oh hi there cutie","Lovely weather today","Do you like my dress","Welcome to the town"],
+ "speed":20,
+ "hp":24000,
+ "delay":6000,
+ "level":80,
+ "interaction":["I used to sell potions around here, but I decided to retire.","Always nice to see smiling new faces.","Are you new here? Welcome.","This town has grown a lot, I was around when it was just one small block of land."],
+ "aura":{
+ "gold":200,
+ },
+ "modal":"npc-angel",
+ },
+ "citizen5":{
+ "name":"Grundur",
+ "role":"citizen",
+ "skin":"generalg",
+ "type":"fullstatic",
+ "says":["I remember the battle of the beards","Hello","Greetings","Good day","Pretty cold outside ay","Do you like my outfit","Hi there","Tomorrow is a new day","Ive seen some real shit","Back in my day ...","Stompy better die","*yawns*","So much snow around here","*drinks beer*",],
+ "speed":30,
+ "hp":18600,
+ "delay":1200,
+ "steps":12,
+ "level":90,
+ "interaction":["It is pretty cold outside. I should invest in a hat.","I came here to pursue a beast called \"Stompy\". I've heard this creature lives in the Ice Mountains nearby.","I came here for adventure, but now I'm stuck in this bar due to the cold."],
+ },
+ "citizen6":{
+ "name":"Fredric",
+ "role":"citizen",
+ "skin":"mailman",
+ "type":"fullstatic",
+ "says":["*searches through mail bag*","*hums to self*","*whisles*","Are you new here","Ohh you're an adventurer","Good day adventurer","I like love letters they are sweet","Um I don't read your letters","Hey stranger"],
+ "speed":30,
+ "hp":18600,
+ "delay":1200,
+ "steps":12,
+ "level":90,
+ "interaction":["Hi, I'm a mail man! But no one sends mail out here much. So I guess it's a pretty easy job.","Careful it's cold outside. But it's nice and warm in here."],
+ },
+ "citizen7":{
+ "name":"Lucy",
+ "role":"citizen",
+ "skin":"lucy",
+ "type":"fullstatic",
+ "says":["Do you like my scarf","My mom made my scarf","Do you know who santa is","I wonder where santa lives","I'm used to the cold here","Hi","Im going to move to a warmer place one day","This scarf makes me warm","Don't hit on me","I have a boyfriend","The leather guy is my boyfriend","I think Stompy is just misunderstood"],
+ "speed":30,
+ "hp":3200,
+ "delay":1200,
+ "level":48,
+ "interaction":["Hi! Would you like to know a secret? I love the snow.","Make sure you keep moving, don't want to catch a cold out here.","I have heard that Santa sometimes visits here during Xmas!"],
+ },
+ "citizen8":{
+ "name":"Wyr",
+ "role":"citizen",
+ "skin":"frozenrogue",
+ "type":"fullstatic",
+ "says":["How are you","*wipes snow off himself*","It's cold here","*shivers*","This is a pretty small village","I've meet a real elf","Don't go swimming here it's cold"],
+ "speed":38,
+ "hp":16000,
+ "delay":1200,
+ "level":78,
+ "interaction":["Are you here to kill Stompy too? Well I guess let the best adventurer get to him first!","My hair was actually black, before it happened."],
+ },
+ "citizen9":{
+ "name":"Lilith",
+ "role":"citizen",
+ "skin":"lilith",
+ "type":"fullstatic",
+ "says":["Oh you like my hair","Are you here to serve","I'm sure I can fight off stompy","Stompy doesn't scare me","Wizard is my boss","Good day","Oh it's snowing","Snow is nice","Don't bother the guards building","Don't flirt with me","I protect and serve","I'm a commander","Greetings stranger","Hello stranger","Hi stranger","I serve the mighty Wizard","I was instructed to keep this village safe","The cold doesn't bother me"],
+ "speed":32,
+ "hp":12000,
+ "delay":1200,
+ "level":92,
+ "interaction":["Greetings Adventurer, are you here to kill some monsters? Great! Always looking for help keeping this land safe.","Believe it or not. I am the highest ranking officer in these parts. I work hard to keep this town operating and safe."],
+ },
+ "citizen10":{
+ "name":"Caroline",
+ "role":"citizen",
+ "skin":"pink",
+ "type":"fullstatic",
+ "says":["Hi","My coat keeps me super warm","Stompy used to be my favorite boar","I wish stompy would come home","That inn over there is always a great place","I want to be everyone's friend","Do you need a hug","Hugs keep you warm","*gives you a hug*","Free hugs","This village is mostly boar farmers","Hey","Hello","*wiggles in pink coat*","Pink is my favorite color","I'd love to work for Santa"],
+ "speed":28,
+ "hp":12000,
+ "delay":1200,
+ "level":92,
+ "heal":2400,
+ "seek":"cuteness",
+ "class":"priest",
+ "interaction":["Hey Hey guess what! I like the color Pink! I bet you couldn't guess that.","If Santa ever comes back, I hope I could be his little helper.","Make sure you wear warm clothes, it's a little chilly out here."],
+ },
+ "citizen11":{
+ "name":"Baron",
+ "role":"citizen",
+ "skin":"baron",
+ "class":"priest",
+ "seek":"low_hp",
+ "type":"fullstatic",
+ "says":["Stranger","Where is mother","Cursed land","Stay clear","Go away","Back away","*stares blankly*","*stares coldly*","...",".....","........","Halt","Must protect","Never forget","Defend","Protect","For honor"],
+ "speed":28,
+ "attack":1800,
+ "range":320,
+ "hp":120000,
+ "delay":12000,
+ "level":120,
+ "interaction":["Guard. Village. Protect. Innocents.","Brothers. Rest. Here. Protect. Over. Their. Graves.","Remember. The. Fallen. Never. Forget. Their. Sacrifices.","Heal. The. Fallen."],
+ },
+ "citizen12":{
+ "name":"Marven",
+ "role":"citizen",
+ "skin":"marven",
+ "type":"fullstatic",
+ "says":["I'd hate to find you dead *wink*","Bloody hell","What are you doing here","Who the hell would like living here","Where is my shovel","Stay out of the graveyard","Go home kid","Seen any good junk around","Whatca looking for","Go away","This isn't the place for you","Ever heard of minding your own business","Ever seen a dead man","Hhehehe","Finders keepers"],
+ "speed":32,
+ "hp":1200,
+ "delay":3200,
+ "level":42,
+ "interaction":["I watch over the graves. Sometimes people leave 'gifts' on a grave. Ehhh, sometimes I clean the graves of these items."],
+ },
+ "citizen13":{
+ "name":"Divian",
+ "role":"citizen",
+ "skin":"grogue",
+ "type":"fullstatic",
+ "says":["I see dead people","Ghosts speak to me","Are zombies real","R.I.P. Such nice letters","*evil glare*","I serve Death","Death is my leader","All Hail Death","Danger awaits you","Dracul please take me as your bride","Death isn't the end","Do you know of any cults","Wizard could go to hell I serve Death","It never rains here, I'm only happy when it rains","My eyes are blood red","My favorite color is red","I'd like to meet my demons"],
+ "speed":32,
+ "hp":1200,
+ "delay":3200,
+ "level":42,
+ "interaction":["I am a firm believer that the dark arts would solve a lot of problems if it was acceptable to practice them.","Did you know that Ms. Dracul used to be a member of this village... before she transcended the limitations of mankind. I wish I had the courage to do the rituals required.","Dracul is a very well-known name around these parts. I wish I could be like them..","I heard there is a way to get +13 items, anything can turn into one, but you can't even see it ..."],
+ },
+ "citizen14":{
+ "name":"Violet",
+ "role":"citizen",
+ "skin":"spkw",
+ "type":"fullstatic",
+ "speed":28,
+ "hp":4000,
+ "delay":4000,
+ "level":70,
+ "says":["Hello there","Where's that boy?","SON!!!","Play time is over!","Welcome","Same old same old","Ohh a visitor","Well hi there","It's getting late","Home sweet home","Are you hungry?"],
+ "interaction":["Have you seen my son? He should be around here somewhere.","It's not a very nice neighborhood around here, But the rent is cheap!","I heard somewhere that's there's some sort of pumpkin person walking around? That just sounds silly to me"],
+ },
+ "citizen15":{
+ "name":"Timmy",
+ "role":"citizen",
+ "skin":"spkc",
+ "type":"fullstatic",
+ "speed":16,
+ "hp":200,
+ "delay":200,
+ "level":4,
+ "says":["I think I saw a pumpkin move!!","I like pumpkins","Size doesn't matter!","You found me","Boo!!","Weee","Hello","*Mumble Mumble*"],
+ "interaction":["Be careful around here? It's really dangerous up to the north.","I like to play with the pumpkins, but sometimes they don't want to play and just walk away..","My imaginary friend is real! And a pumpkin!!"],
+ },
+ "citizen16":{
+ "name":"Cunn",
+ "role":"citizen",
+ "skin":"cunn",
+ "class":"ranger",
+ "seek":"dragondagger",
+ "transport":True,
+ "type":"fullstatic",
+ "slots":{
+ "mainhand":{"name":"crossbow","level":7},
+ },
+ "says":["Yo"],
+ "speed":36,
+ "attack":1200,
+ "range":320,
+ "hp":12000,
+ "delay":1000,
+ "level":72,
+ "interaction":["What? What? WHAT?!","I don't really have much tolerance for anyone.","I follow only the most badass!"],
+ },
+ "holo0":{
+ "name":"Green",
+ "role":"citizen",
+ "skin":"greengreen",
+ "type":"fullstatic",
+ "speed":24,
+ "hp":6000,
+ "delay":5000,
+ "level":0,
+ "says":["rbin"],
+ "interaction":["rbin"],
+ },
+ "holo1":{
+ "name":"Pink",
+ "role":"citizen",
+ "skin":"pinkie",
+ "type":"fullstatic",
+ "speed":24,
+ "hp":6000,
+ "delay":5000,
+ "level":0,
+ "says":["rbin"],
+ "interaction":["rbin"],
+ },
+ "holo2":{
+ "name":"Purple",
+ "role":"citizen",
+ "skin":"purpo",
+ "type":"fullstatic",
+ "speed":30,
+ "hp":6000,
+ "delay":7000,
+ "level":0,
+ "says":["rbin"],
+ "interaction":["rbin"],
+ },
+ "holo3":{
+ "name":"Scarf",
+ "role":"citizen",
+ "skin":"scarf",
+ "type":"fullstatic",
+ "speed":24,
+ "hp":6000,
+ "delay":3000,
+ "level":0,
+ "says":["rbin"],
+ "interaction":["rbin"],
+ },
+ "holo4":{
+ "name":"Twig",
+ "role":"citizen",
+ "skin":"twig",
+ "type":"fullstatic",
+ "speed":48,
+ "hp":6000,
+ "delay":24000,
+ "level":0,
+ "says":["rbin"],
+ "interaction":["rbin"],
+ },
+ "holo5":{
+ "name":"Bobo",
+ "role":"citizen",
+ "skin":"bobo",
+ "type":"fullstatic",
+ "speed":16,
+ "hp":6000,
+ "delay":8000,
+ "level":0,
+ "says":["rbin"],
+ "interaction":["rbin"],
+ },
+ "princess":{
+ "name":"Princess",
+ "role":"citizen",
+ "skin":"princess",
+ "type":"fullstatic",
+ "speed":24,
+ "hp":6000,
+ "delay":5000,
+ "level":72,
+ "says":["Oh, Hello!"],
+ "interaction":["Wanna taste my daggers?"],
+ },
+ "bouncer":{
+ "name":"Wogue",
+ "role":"bouncer",
+ "skin":"bouncer",
+ "type":"fullstatic",
+ "level":88,
+ "says":["What?","BOUNCE"],
+ "interaction":["Wanna taste my daggers? One move out of line. And you will!","Come on! One sexist word out of your mouth. Just one. Let's see what your tombstone looks like."],
+ },
+ "goldnpc":{
+ "name":"Mr. Rich",
+ "role":"gold",
+ "skin":"goblin_a",
+ "says":"GOLD!",
+ "color":"#E0B427",
+ "aspeed":"slow",
+ },
+ "wizardrepeater":{
+ "name":"Wizard",
+ "role":"repeater",
+ "skin":"wizard",
+ "color":"#66BB52",
+ "says":"SHELLS!",
+ "type":"fullstatic",
+ "interval":3000,
+ },
+ "wnpc":{
+ "name":"Wizard",
+ "role":"thesearch",
+ "quest":"glitch",
+ "skin":"wizard",
+ #"color":"#23B0AB",
+ #"says":"Hmm",
+ "color":"#D96643",
+ "says":"Help",
+ "type":"fullstatic",
+ },
+ "craftsman":{
+ "name":"Joe",
+ "role":"craftsman",
+ "skin":"npcc",
+ "color":"#9EACAE",
+ "says":"Give it to me",
+ "type":"fullstatic",
+ "name":"Leo",
+ },
+ "items0":{
+ "name":"Gabrielle",
+ "role":"items",
+ "pack":"items0",
+ "skin":"gabrielle",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items1":{
+ "name":"Gabriella",
+ "role":"items",
+ "pack":"items1",
+ "skin":"gabrielle",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items2":{
+ "name":"Ledia",
+ "role":"items",
+ "pack":"items2",
+ "skin":"lady3",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items3":{
+ "name":"Lidia",
+ "role":"items",
+ "pack":"items3",
+ "skin":"lady3",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items4":{
+ "name":"Christie",
+ "role":"items",
+ "pack":"items4",
+ "skin":"lady4",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items5":{
+ "name":"Christina",
+ "role":"items",
+ "pack":"items5",
+ "skin":"lady4",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items6":{
+ "name":"Jane",
+ "role":"items",
+ "pack":"items6",
+ "skin":"lady2",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "items7":{
+ "name":"Janet",
+ "role":"items",
+ "pack":"items7",
+ "skin":"lady2",
+ #"skin":"goblin_a",
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ },
+ "basics":{
+ "role":"merchant",
+ "items":[
+ "helmet","shoes","gloves","pants","coat",
+ "blade","claw","staff","bow","wshield",
+ "wand","mace","wbasher",
+ ],
+ "skin":"daggers",
+ "says":"Blades, blades, blades",
+ "atype":"flow",
+ "name":"Gabriel",
+ },
+ "premium":{
+ "old_role":"premium",
+ "role":"merchant",
+ "items":[
+ "xpbooster","goldbooster","luckbooster",None,None,
+ "xptome","offering",None,None,None,
+ "qubics",None,None,None,None,
+ None,None,None,None,None
+
+ ],
+ "skin":"pflow",
+ "says":"MMM",
+ "atype":"flow",
+ "name":"Garwyn",
+ },
+ "antip2w":{
+ "old_role":"merchant",
+ "role":"premium",
+ "old_items":[
+ "xpbooster","goldbooster","luckbooster",None,None,
+ "xptome","offering",None,None,None,
+ "qubics",None,None,None,
+
+ ],
+ #"items":["cosmo0","cosmo1","cosmo2",None,None,"cosmo3","cosmo4"],
+ "items":["cosmo0","cosmo2","cosmo3"],
+ "skin":"fancyd",
+ "says":"Sup",
+ "type":"fullstatic",
+ "name":"Mr. Dworf",
+ "old_side_interaction":{"auto":True,"skin":"fancyd","message":"I'm the Anti-P2W Authority around here. Making sure all critical items can be bought with gold. Prices can fluctuate based on inflation."},
+ "side_interaction":{"auto":True,"skin":"fancyd","message":"Hey there, good looking fellow. Would you be interested in looking better?"},
+ },
+ "armors":{
+ "role":"merchant",
+ "items":[
+ #"helmet","shoes","gloves","pants","coat",
+ ],
+ "skin":"armorguy",
+ "says":"YESS",
+ "atype":"flow",
+ },
+ "weapons":{
+ "role":"merchant",
+ "items":[
+ "blade","claw","staff","bow",
+ ],
+ "skin":"daggers",
+ "says":"Blades, blades, blades",
+ "atype":"flow",
+ "ignore":True,
+ },
+ "exchange":{
+ "role":"exchange",
+ "skin":"magic",
+ "says":"Good Luck!",
+ "name":"Xyn",
+ },
+ "shrine":{
+ "role":"shrine",
+ "skin":"shrine",
+ "type":"static",
+ },
+ "compound":{
+ "role":"compound",
+ "skin":"shrine2",
+ "type":"static",
+ },
+ "newupgrade":{
+ "role":"newupgrade",
+ "skin":"newupgrade",
+ "says":"+1",
+ "atype":"flow",
+ "name":"Cue",
+ },
+ "locksmith":{
+ "role":"locksmith",
+ "skin":"asoldier",
+ "says":"X",
+ "type":"fullstatic",
+ "name":"Smith",
+ },
+ "transporter":{
+ "role":"transport",
+ "skin":"spell",
+ "says":"Woo",
+ "color":"#7965C6",
+ "places":{
+ "winterland":1,
+ "main":9,
+ #"halloween":1,
+ "desertland":1,
+ "cyberland":0,
+ "test":0,
+ "d_e":0,
+ },
+ "name":"Alia",
+ },
+ "appearance":{
+ "role":"cx",
+ "quest":"cx",
+ "skin":"zengirl",
+ "says":"Now!",
+ "name":"Haila",
+ "color":"#D95CB4",
+ "aspeed":"slow",
+ },
+ "lichteaser":{
+ "role":"tease",
+ "skin":"lichteaser",
+ "type":"static",
+ "says":"Soon",
+ "color":"#5A1D7F",
+ },
+}
+for i in range(8,48):
+ npcs["items%d"%i]={
+ "name":"X%d"%i,
+ "role":"items",
+ "pack":"items%d"%i,
+ "skin":"mabw",
+ "cx":{"head":"bwhead"},
+ "color":"#E0D8A5",
+ "type":"fullstatic",
+ }
+for npc in npcs:
+ npcs[npc]["id"]=npc
diff --git a/design/precomputed.py b/design/precomputed.py
new file mode 100644
index 0000000..d5e64ba
--- /dev/null
+++ b/design/precomputed.py
@@ -0,0 +1,2 @@
+# Fri Oct 13 2023 21:25:15 GMT+0300 (GMT+03:00)
+images={"/images/tiles/characters/ninja_turtles.png":{"height":144,"width":312,"type":"png"},"/images/cosmetics/makeup/makeup1.png":{"height":120,"width":1134,"type":"png"},"/images/cosmetics/hairdo/bwhair.png":{"height":120,"width":27,"type":"png"},"/images/cosmetics/beardo/burningeyes1_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/beardo/burningeyes2_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/hats/bathat_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/hats/gcandle_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/hats/halo_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/makeup/kunique.png":{"height":120,"width":108,"type":"png"},"/images/cosmetics/skins/mbw.png":{"height":144,"width":81,"type":"png"},"/images/cosmetics/armors/mabw.png":{"height":144,"width":162,"type":"png"},"/images/cosmetics/accessories/kglasses.png":{"height":120,"width":108,"type":"png"},"/images/cosmetics/gravestones/gravestone.png":{"height":64,"width":160,"type":"png"},"/images/tiles/monsters/deep_sea_king.png":{"height":320,"width":318,"type":"png"},"/images/tiles/characters/adversaries.png":{"height":288,"width":324,"type":"png"},"/images/tiles/characters/angel_wingless.png":{"height":288,"width":456,"type":"png"},"/images/tiles/characters/winners_jpa.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/winners_jpb.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/sheet_winnersa.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/sheet_winnersb.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collection1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collection2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collection3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collectionx.png":{"height":288,"width":456,"type":"png"},"/images/tiles/monsters/snowman.png":{"height":144,"width":76,"type":"png"},"/images/tiles/monsters/Dragold.png":{"height":212,"width":156,"type":"png"},"/images/tiles/monsters/blackscorpion.png":{"height":256,"width":176,"type":"png"},"/images/tiles/monsters/coboldProto.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/liger_x.png":{"height":184,"width":150,"type":"png"},"/images/tiles/monsters/tiger.png":{"height":184,"width":150,"type":"png"},"/images/tiles/monsters/slenderman.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/frankenstein.png":{"height":144,"width":76,"type":"png"},"/images/tiles/characters/custom1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/custom2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/custom3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/others/jsonX.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/mecha_gnome.png":{"height":144,"width":78,"type":"png"},"/images/tiles/monsters/harpy_b_1.png":{"height":212,"width":156,"type":"png"},"/images/tiles/monsters/harpy_b_fly_1.png":{"height":212,"width":156,"type":"png"},"/images/tiles/monsters/harpy_a_1.png":{"height":212,"width":156,"type":"png"},"/images/tiles/monsters/harpy_a_fly_1.png":{"height":212,"width":156,"type":"png"},"/images/tiles/characters/others/ship2.png":{"height":64,"width":201,"type":"png"},"/images/tiles/characters/others/newyear_tree.png":{"height":64,"width":144,"type":"png"},"/images/tiles/characters/bonus1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/military2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/military3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/knights.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara4.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara6.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara7.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara8.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/automatron2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc4.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc5.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc6.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/dwarf2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/tristone_m.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/tristone_f.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/mystics.png":{"height":144,"width":312,"type":"png"},"/images/tiles/monsters/creatures1.png":{"height":144,"width":312,"type":"png"},"/images/tiles/monsters/creatures2.png":{"height":424,"width":624,"type":"png"},"/images/tiles/monsters/jrpumpkins.png":{"height":144,"width":155,"type":"png"},"/images/tiles/characters/chara5.png":{"height":288,"width":312,"type":"png"},"/images/tiles/items/chests.png":{"height":288,"width":504,"type":"png"},"/images/tiles/characters/animationc.png":{"height":400,"width":564,"type":"png"},"/images/tiles/characters/animation1i.png":{"height":400,"width":564,"type":"png"},"/images/tiles/characters/animation2.png":{"height":400,"width":564,"type":"png"},"/images/tiles/characters/animation3.png":{"height":400,"width":564,"type":"png"},"/images/tiles/monsters/elemental.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/monster_dknight1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_dknight2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/fairies.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/monster_bird1.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_bird2.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_bird3.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_boar.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_cacto.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/rudolphi.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_elk.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_golem1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_golem2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_lich.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_lizardman1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_lizardman2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/stompy3.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_minotaur.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_phoenix.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_raptor1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_raptor2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/grinch.png":{"height":144,"width":82,"type":"png"},"/images/tiles/monsters/monster_treant.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_wolf1.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_wolf2.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/json.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/custom1.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/custom2.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/goos.png":{"height":256,"width":360,"type":"png"},"/images/tiles/monsters/monster1.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/animals1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/animals2.png":{"height":288,"width":504,"type":"png"},"/images/tiles/monsters/birds1_modded.png":{"height":288,"width":504,"type":"png"},"/images/tiles/monsters/goblinos.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/goblinkingb.png":{"height":212,"width":156,"type":"png"},"/images/tiles/monsters/monsterc6.png":{"height":512,"width":692,"type":"png"},"/images/tiles/monsters/tinyfairies.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/monsterc2.png":{"height":400,"width":564,"type":"png"},"/images/tiles/monsters/robots.png":{"height":288,"width":372,"type":"png"},"/images/tiles/monsters/mage.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/monster2.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/monster3c.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/monster4.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/vampire2d.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/mr_pumpkin.png":{"height":144,"width":80,"type":"png"},"/images/tiles/monsters/cbee.png":{"height":144,"width":78,"type":"png"},"/images/tiles/monsters/iceGolem.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/green.png":{"height":144,"width":80,"type":"png"},"/images/sprites/emblems/emblems.png":{"height":96,"width":480,"type":"png"},"/images/cosmetics/skins/sskin1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/skins/mskin1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/skins/lskin1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/sbody1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/mbody1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/mbody2.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/mbody3.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/mbody4.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/mbody5.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/mbody6.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/sarmor1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/sarmor2.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor2.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor3.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor4.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor5.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor6.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor7.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor8.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor9.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor10.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor11.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor12.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/larmor1.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/lchar1.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/mchar16.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/schar7.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/xschar2.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/xxschar2.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/hairdo/hairdo1.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hairdo/hairdo2.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hairdo/hairdo3.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hairdo/hairdo4.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hairdo/hairdo5.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hairdo/hairdo6.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hats/hats1.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hats/hats2.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hats/hats3.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/hats/hats4.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/wings/wings1.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/wings/wings2.png":{"height":144,"width":128,"type":"png"},"/images/cosmetics/wings/wings3.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/wings/backpacks.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/wings/backpack2.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/tails/wolftail.png":{"height":144,"width":108,"type":"png"},"/images/cosmetics/tails/wolftail2.png":{"height":144,"width":108,"type":"png"},"/images/cosmetics/tails/wolftail3.png":{"height":144,"width":108,"type":"png"},"/images/cosmetics/makeup/smakeup.png":{"height":120,"width":27,"type":"png"},"/images/cosmetics/makeup/malemakeup.png":{"height":120,"width":378,"type":"png"},"/images/cosmetics/makeup/femalemakeupv2.png":{"height":120,"width":351,"type":"png"},"/images/cosmetics/makeup/fmakeup.png":{"height":120,"width":351,"type":"png"},"/images/cosmetics/accessories/eyeglasses.png":{"height":120,"width":1107,"type":"png"},"/images/cosmetics/beardo/beard1.png":{"height":120,"width":1107,"type":"png"},"/images/cosmetics/beardo/mask1.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/beardo/facemakeup.png":{"height":120,"width":675,"type":"png"},"/images/cosmetics/makeup/male_makeup.png":{"height":120,"width":567,"type":"png"},"/images/cosmetics/makeup/female_makeup.png":{"height":120,"width":621,"type":"png"},"/images/cosmetics/makeup/unisex_makeup.png":{"height":120,"width":648,"type":"png"},"/images/tiles/items/pack_1a.png":{"height":2048,"width":256,"type":"png"},"/images/tiles/items/pack_20vt8.png":{"height":1280,"width":320,"type":"png"},"/images/tiles/items/skills_20v6.png":{"height":260,"width":320,"type":"png"},"/images/tiles/items/custom.png":{"height":180,"width":140,"type":"png"},"/images/tiles/map/castle.png":{"height":512,"width":544,"type":"png"},"/images/tiles/map/custom2.png":{"height":560,"width":752,"type":"png"},"/images/tiles/map/custom.png":{"height":480,"width":480,"type":"png"},"/images/tiles/map/custom_a.png":{"height":320,"width":320,"type":"png"},"/images/tiles/map/doors.png":{"height":256,"width":192,"type":"png"},"/images/tiles/map/dungeon.png":{"height":416,"width":912,"type":"png"},"/images/tiles/map/house.png":{"height":1168,"width":1104,"type":"png"},"/images/tiles/map/inside.png":{"height":816,"width":832,"type":"png"},"/images/tiles/map/outside.png":{"height":832,"width":904,"type":"png"},"/images/tiles/map/puzzle.png":{"height":320,"width":336,"type":"png"},"/images/tiles/map/water_updated.png":{"height":1200,"width":704,"type":"png"},"/images/tiles/map/winter.png":{"height":640,"width":912,"type":"png"},"/images/tiles/map/fort.png":{"height":832,"width":656,"type":"png"},"/images/tiles/map/beach_v2.png":{"height":416,"width":576,"type":"png"},"/images/tiles/map/world.png":{"height":288,"width":432,"type":"png"},"/images/tiles/items/stands.png":{"height":144,"width":78,"type":"png"},"/images/tiles/map/new.png":{"height":480,"width":672,"type":"png"},"/images/tiles/map/dark_dimension.png":{"height":336,"width":464,"type":"png"},"/images/tiles/map/jungle.png":{"height":336,"width":496,"type":"png"},"/images/tiles/map/ship.png":{"height":448,"width":864,"type":"png"},"/images/tiles/map/ashlands.png":{"height":336,"width":640,"type":"png"},"/images/tiles/map/ruins.png":{"height":832,"width":704,"type":"png"},"/images/tiles/map/tree.png":{"height":576,"width":544,"type":"png"},"/images/tiles/map/lights.png":{"height":480,"width":640,"type":"png"}}
diff --git a/design/projectiles.py b/design/projectiles.py
new file mode 100644
index 0000000..7f2ff54
--- /dev/null
+++ b/design/projectiles.py
@@ -0,0 +1,187 @@
+projectiles={
+ "momentum":{
+ "animation":"slash",
+ "speed":320,
+ "hit_animation":"slash1",
+ },
+ "quickpunch":{
+ "animation":"slash",
+ "speed":420,
+ "hit_animation":"slash2",
+ "hit_text":["PUNCH!","#41338B"],
+ },
+ "quickstab":{
+ "animation":"slash",
+ "speed":420,
+ "hit_animation":"slash2",
+ "hit_text":["STAB!","#41338B"],
+ },
+ "smash":{
+ "animation":"slash",
+ "speed":420,
+ "hit_animation":"slash2",
+ "hit_text":["SMASH!","#CBB892"],
+ },
+ "wmomentum":{
+ "animation":"wslash",
+ "speed":520,
+ "hit_animation":"slash3",
+ },
+ "arrow":{
+ "animation":"carrow",
+ "speed":500,
+ "hit_animation":"arrow_hit",
+ },
+ "crossbowarrow":{
+ "animation":"carrow",
+ "speed":700,
+ "hit_animation":"arrow_hit",
+ },
+ "garrow":{
+ "animation":"garrow",
+ "speed":640,
+ "hit_animation":"arrow_hit",
+ },
+ "poisonarrow":{
+ "animation":"arrow1",
+ "speed":400,
+ "hit_animation":"arrow_hit",
+ "hit_text":["POISONED!","poison"],
+ },
+ "pouch":{
+ "animation":"poucharrow",
+ "speed":300,
+ "hit_animation":"explode_b",
+ },
+ "firearrow":{
+ "animation":"firearrow",
+ "speed":460,
+ "hit_animation":"arrow_hit",
+ },
+ "frostarrow":{
+ "animation":"frostarrow",
+ "speed":580,
+ "hit_animation":"icecrack",
+ },
+ "acid":{
+ "animation":"acid",
+ "speed":280,
+ },
+ "supershot":{
+ "animation":"superarrow",
+ "speed":600,
+ "hit_animation":"supershot",
+ "hit_text":["SUPERSHOT!","#9B172E"],
+ },
+ "magic":{
+ "animation":"magic1",
+ "speed":400,
+ "hit_animation":"explode_c",
+ },
+ "bigmagic":{
+ "animation":"magic0",
+ "speed":320,
+ "hit_animation":"explode_c",
+ },
+ "wandy":{
+ "animation":"wandy",
+ "speed":560,
+ "hit_animation":"explode_c",
+ },
+ "pinky":{
+ "animation":"pinky",
+ "speed":460,
+ "hit_animation":"explode_c",
+ },
+ "magic_purple":{
+ "animation":"magic3",
+ "speed":400,
+ "hit_animation":"explode_c",
+ },
+ "magic_divine":{
+ "animation":"magic4",
+ "speed":480,
+ "hit_animation":"explode_c",
+ },
+ "mmagic":{
+ "animation":"mblob_purplish",
+ "speed":400,
+ "hit_animation":"explode_p",
+ },
+ "pmagic":{
+ "animation":"magic2",
+ "speed":360,
+ "hit_animation":"explode_p",
+ },
+ "stone":{
+ "animation":"pblob",
+ "speed":320,
+ "hit_animation":"slash1",
+ },
+ "stone_k":{
+ "animation":"pblob",
+ "speed":320,
+ "hit_animation":"explode_b",
+ },
+ "fireball":{
+ "animation":"fireball",
+ "speed":320,
+ "hit_animation":"explode_c",
+ },
+ "frostball":{
+ "animation":"frostball",
+ "speed":420,
+ "hit_animation":"explode_c",
+ },
+ "snowball":{
+ "speed":180,
+ "animation":"snowball",
+ "hit_animation":"snowball_hit",
+ "pure":True,
+ },
+ "plight":{
+ "animation":"heal_projectile",
+ "speed":120,
+ "hit_animation":"heal",
+ },
+ "curse":{
+ "animation":"curse_projectile",
+ "speed":240,
+ "hit_animation":"curse_new",
+ },
+ "cupid":{
+ "animation":"cuarrow",
+ "speed":320,
+ "hit_animation":"heal",
+ },
+ "mentalburst":{
+ "instant":True,
+ "ray":"tiling_burstj",
+ "kill_text":["POW!","#4C9AE0"],
+ "hit_animation":"burst",
+ },
+ "purify":{
+ "instant":True,
+ "hit_text":["PURIFIED!","#DDCC7B"],
+ "hit_animation":"flare_yellow",
+ },
+ "burst":{
+ "instant":True,
+ "ray":"tiling_burstj",
+ "hit_animation":"burst",
+ },
+ "sburst":{ #small burst
+ "instant":True,
+ "ray":"tiling_burst",
+ "hit_animation":"burst",
+ },
+ "gburst":{
+ "instant":True,
+ "ray":"tiling_burst_g",
+ "hit_animation":"gburst",
+ },
+ "partyheal":{
+ "instant":True,
+ "hit_animation":"party_heal",
+ }
+}
\ No newline at end of file
diff --git a/design/prototypes/.DS_Store b/design/prototypes/.DS_Store
new file mode 100644
index 0000000..a2c6333
Binary files /dev/null and b/design/prototypes/.DS_Store differ
diff --git a/design/prototypes/global_luck.txt b/design/prototypes/global_luck.txt
new file mode 100644
index 0000000..d2a15b6
--- /dev/null
+++ b/design/prototypes/global_luck.txt
@@ -0,0 +1,22 @@
+Players Buff
+100 +10%
+150 +15%
+200 +20%
+250 +25%
+300 +30%
+400 +35%
+500 +40%
+600 +50%
+800 +60%
+1000 +70%
+1250 +75%
+1500 +80%
+2000 +85%
+2500 +90%
+3000 +95%
+4000 +100%
+5000 +120%
+6000 +130%
+8000 +140%
+10000 +150%
+20000 +200%
\ No newline at end of file
diff --git a/design/prototypes/hardcore_rewards.txt b/design/prototypes/hardcore_rewards.txt
new file mode 100644
index 0000000..38e7d66
--- /dev/null
+++ b/design/prototypes/hardcore_rewards.txt
@@ -0,0 +1,52 @@
+Top 5 by Level
+1-
+2-
+3-
+4-
+5-
+
+Most Unique Kills
+-
+
+Top Warrior
+-
+
+Top Mage
+-
+
+Top Rogue
+-
+
+Top Ranger
+-
+
+Top Paladin
+-
+
+Top Priest
+-
+
+First Warrior to Level 70
+-
++ ...
+
+First +9
+-
+
+First +10
+-
+
+First +11
+-
+
+First +12
+-
+
+First +13
+-
+
+First +5 Accessory
+-
+
+Most Gold
+-
\ No newline at end of file
diff --git a/design/prototypes/test.rtf b/design/prototypes/test.rtf
new file mode 100644
index 0000000..ef4b1fd
--- /dev/null
+++ b/design/prototypes/test.rtf
@@ -0,0 +1,10 @@
+{\rtf1\ansi\ansicpg1252\cocoartf2513
+\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red32\green0\blue99;\red255\green255\blue51;}
+{\*\expandedcolortbl;;\cssrgb\c17067\c7357\c46453;\cssrgb\c99946\c98636\c25320;}
+\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
+
+\f0\fs24 \cf2 gg\
+\
+\cf3 lol}
\ No newline at end of file
diff --git a/design/recipes.py b/design/recipes.py
new file mode 100644
index 0000000..199d9fe
--- /dev/null
+++ b/design/recipes.py
@@ -0,0 +1,639 @@
+craft={
+ "basketofeggs":{
+ "items":[
+ [1,"egg0"],
+ [1,"egg1"],
+ [1,"egg2"],
+ [1,"egg3"],
+ [1,"egg4"],
+ [1,"egg5"],
+ [1,"egg6"],
+ [1,"egg7"],
+ [1,"egg8"],
+ ],
+ "cost":100,
+ },
+ "xbox":{
+ "items":[
+ [1,"x0"],
+ [1,"x1"],
+ [1,"x2"],
+ [1,"x3"],
+ [1,"x4"],
+ [1,"x5"],
+ [1,"x6"],
+ [1,"x7"],
+ [1,"x8"],
+ ],
+ "cost":1200,
+ },
+ "carrotsword":{
+ "items":[
+ [1,"blade"],
+ [1,"carrot"],
+ ],
+ "cost":500,
+ },
+ "wblade":{
+ "items":[
+ [1,"stick",9],
+ [1,"blade",9],
+ [800,"essenceoffrost"],
+ ],
+ "cost":24000000,
+ },
+ "rod":{
+ "items":[
+ [1,"staff"],
+ [1,"spidersilk"],
+ ],
+ "cost":100,
+ },
+ "pickaxe":{
+ "items":[
+ [1,"staff"],
+ [1,"spidersilk"],
+ [1,"blade"],
+ ],
+ "cost":100,
+ },
+ "stealthcape":{
+ "items":[
+ [1,"bcape",7],
+ [5,"shadowstone"],
+ [200,"essenceofnature"],
+ [1000,"cscale"],
+ ],
+ "cost":2000000,
+ },
+ "cake":{
+ "items":[
+ [10,"whiteegg"],
+ ],
+ "cost":5,
+ },
+ "bfangamulet":{
+ "items":[
+ [1,"bfang"],
+ [5000,"bwing"],
+ ],
+ "cost":4000000,
+ },
+ # "stand1":{
+ # "items":[
+ # [1,"stand0"],
+ # [1,"ledger"],
+ # [6,"storagebox"],
+ # ],
+ # "cost":6400000,
+ # },
+ "wingedboots":{
+ "items":[
+ [1,"shoes"],
+ [20,"feather0"],
+ ],
+ "cost":120000,
+ },
+ "fierygloves":{
+ "items":[
+ [1,"gloves"],
+ [20,"feather0"],
+ [2,"essenceoffire"],
+ ],
+ "cost":120000,
+ },
+ "fclaw":{
+ "items":[
+ [1,"claw"],
+ [2,"essenceoffrost"],
+ ],
+ "cost":20000,
+ },
+ "fsword":{
+ "items":[
+ [1,"blade"],
+ [2,"essenceoffrost"],
+ ],
+ "cost":20000,
+ },
+ "froststaff":{
+ "items":[
+ [1,"staff"],
+ [2,"essenceoffrost"],
+ ],
+ "cost":20000,
+ },
+ "snowflakes":{
+ "items":[
+ [1,"throwingstars"],
+ [1,"essenceoffrost"],
+ ],
+ "cost":20000,
+ },
+ "frostbow":{
+ "items":[
+ [1,"bow"],
+ [3,"essenceoffrost"],
+ ],
+ "cost":40000,
+ },
+ "firebow":{
+ "items":[
+ [1,"bow"],
+ [2,"essenceoffire"],
+ ],
+ "cost":40000,
+ },
+ "fireblade":{
+ "items":[
+ [1,"blade"],
+ [1,"essenceoffire"],
+ ],
+ "cost":20000,
+ },
+ "firestaff":{
+ "items":[
+ [1,"staff"],
+ [1,"essenceoffire"],
+ ],
+ "cost":20000,
+ },
+ "firestars":{
+ "items":[
+ [1,"throwingstars"],
+ [1,"essenceoffire"],
+ ],
+ "cost":180000,
+ },
+ "heartwood":{
+ "items":[
+ [1,"woodensword",8],
+ [1,"nheart"],
+ ],
+ "cost":120000000,
+ },
+ "offeringx":{
+ "items":[
+ [10,"offering"],
+ [1200,"essenceofnature"],
+ [200,"essenceoflife"],
+ [1,"essenceofgreed"],
+ ],
+ "cost":32000000,
+ },
+ "computer":{
+ "items":[
+ [1,"networkcard"],
+ [8,"qubics"],
+ [1,"platinumnugget"],
+ [12,"goldnugget"],
+ [100,"electronics"],
+ ],
+ "cost":120000000,
+ },
+ "supercomputer":{
+ "items":[
+ [1,"computer"],
+ [1,"tracker"],
+ [3,"qubics"],
+ [2000,"electronics"],
+ ],
+ "cost":4800000000,
+ },
+ "dartgun":{
+ "items":[
+ [1,"blade",9],
+ [12,"qubics"],
+ [4,"platinumnugget"],
+ [20,"goldnugget"],
+ ],
+ "cost":32000000,
+ },
+ "bronzeingot":{
+ "items":[
+ [16,"bronzenugget"],
+ ],
+ "cost":360000,
+ },
+ "goldingot":{
+ "items":[
+ [12,"goldnugget"],
+ ],
+ "cost":3600000,
+ },
+ "platinumingot":{
+ "items":[
+ [8,"platinumnugget"],
+ ],
+ "cost":36000000,
+ },
+ "candycanesword":{
+ "items":[
+ [1,"blade",7],
+ [1,"candycane"],
+ ],
+ "cost":480000,
+ },
+ "merry":{
+ "items":[
+ [1,"bow"],
+ [1,"candycane"],
+ [1,"mistletoe"],
+ ],
+ "cost":480000,
+ },
+ "harpybow":{
+ "items":[
+ [1,"t2bow"],
+ [100,"feather1"],
+ ],
+ "cost":1640000,
+ },
+ "gstaff":{
+ "items":[
+ [1,"staff",8],
+ [1,"essenceofgreed"],
+ ],
+ "cost":180000,
+ },
+ "pouchbow":{
+ "items":[
+ [1,"bow"],
+ [1,"smoke"],
+ ],
+ "cost":180000,
+ },
+ "ornamentstaff":{
+ "items":[
+ [1,"staff"],
+ [1,"ornament"],
+ [20,"confetti"],
+ ],
+ "cost":120000,
+ },
+ "charmer":{
+ "items":[
+ [1,"goldnugget"],
+ [20,"gem1"],
+ [1,"emptyheart"],
+ ],
+ "cost":80000,
+ },
+ "ctristone":{
+ "items":[
+ [1,"strring"],
+ [1,"intring"],
+ [1,"dexring"],
+ [10,"vitscroll"],
+ ],
+ "cost":20000,
+ },
+ "cclaw":{
+ "items":[
+ [1,"claw"],
+ [1,"crabclaw"],
+ ],
+ "cost":24000,
+ },
+ "slimestaff":{
+ "items":[
+ [1,"staff"],
+ [10,"gslime"],
+ ],
+ "cost":24000,
+ },
+ "mushroomstaff":{
+ "items":[
+ [1,"staff"],
+ [2,"smush"],
+ ],
+ "cost":24000,
+ },
+ "wcap":{
+ "items":[
+ [50,"beewings"],
+ [3,"gslime"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "wgloves":{
+ "items":[
+ [60,"beewings"],
+ [20,"spores"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "wbreeches":{
+ "items":[
+ [10,"crabclaw"],
+ [100,"spores"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "wattire":{
+ "items":[
+ [100,"gslime"],
+ [200,"crabclaw"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "wshoes":{
+ "items":[
+ [5,"frogt"],
+ [500,"beewings"],
+ [100,"crabclaw"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "quiver":{
+ "items":[
+ [1,"ascale"],
+ [200,"beewings"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "orbg":{
+ "items":[
+ [1,"ascale"],
+ [1,"pleather"],
+ [1,"cscale"],
+ [1,"bfur"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "armorring":{
+ "items":[
+ [1,"snakefang"],
+ [1,"lotusf"],
+ [1,"vitring",2],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "resistancering":{
+ "items":[
+ [1,"ink"],
+ [5,"ascale"],
+ [1,"vitring",2],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "lbelt":{
+ "items":[
+ [100,"bfur"],
+ [1,"hpbelt",2],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "stinger":{
+ "items":[
+ [12,"feather0"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "hbow":{
+ "items":[
+ [40,"dstones"],
+ [2,"pleather"],
+ [1,"feather0"],
+ ],
+ "cost":0,
+ "quest":"mcollector",
+ },
+ "snakeoil":{
+ "items":[
+ [40,"dstones"],
+ [9000,"rattail"],
+ ],
+ "cost":0,
+ "quest":"witch",
+ },
+ "elixirfires":{
+ "items":[
+ [1,"cshell"],
+ [2000,"hpot0"],
+ ],
+ "cost":0,
+ "quest":"witch",
+ },
+ "elixirfzres":{
+ "items":[
+ [50,"bfur"],
+ [10,"mpot0"],
+ ],
+ "cost":0,
+ "quest":"witch",
+ },
+ "elixirpnres":{
+ "items":[
+ [500,"bwing"],
+ [1,"hpot0"],
+ ],
+ "cost":0,
+ "quest":"witch",
+ },
+ "daggerofthedead":{
+ "items":[
+ [1,"mbones"],
+ [1,"wand"],
+ ],
+ "cost":24000,
+ },
+ "spearofthedead":{
+ "items":[
+ [2,"mbones"],
+ [1,"spear"],
+ ],
+ "cost":24000,
+ },
+ "staffofthedead":{
+ "items":[
+ [1,"mbones"],
+ [1,"staff"],
+ ],
+ "cost":120000,
+ },
+ "bowofthedead":{
+ "items":[
+ [1,"mbones"],
+ [1,"bow"],
+ ],
+ "cost":120000,
+ },
+ "swordofthedead":{
+ "items":[
+ [1,"mbones"],
+ [1,"sword"],
+ ],
+ "cost":24000,
+ },
+ "maceofthedead":{
+ "items":[
+ [1,"mbones"],
+ [1,"wbasher"],
+ ],
+ "cost":240000,
+ },
+ "pmaceofthedead":{
+ "items":[
+ [1,"mbones"],
+ [1,"pmace"],
+ ],
+ "cost":24000,
+ },
+ "elixirint1":{"items":[[10,"elixirint0"]],"cost":1000},
+ "elixirdex1":{"items":[[10,"elixirdex0"]],"cost":1000},
+ "elixirvit1":{"items":[[10,"elixirvit0"]],"cost":1000},
+ "elixirstr1":{"items":[[10,"elixirstr0"]],"cost":1000},
+ "elixirint2":{"items":[[10,"elixirint1"]],"cost":2400},
+ "elixirdex2":{"items":[[10,"elixirdex1"]],"cost":2400},
+ "elixirvit2":{"items":[[10,"elixirvit1"]],"cost":2400},
+ "elixirstr2":{"items":[[10,"elixirstr1"]],"cost":2400},
+}
+
+dismantle={
+ "daggerofthedead":{
+ "items":[
+ [1,"mbones"],
+ ],
+ "cost":40,
+ },
+ "swordofthedead":{
+ "items":[
+ [1,"mbones"],
+ ],
+ "cost":40,
+ },
+ "staffofthedead":{
+ "items":[
+ [1,"mbones"],
+ ],
+ "cost":40,
+ },
+ "bowofthedead":{
+ "items":[
+ [1,"mbones"],
+ ],
+ "cost":40,
+ },
+ "maceofthedead":{
+ "items":[
+ [1,"mbones"],
+ ],
+ "cost":40,
+ },
+ "pmaceofthedead":{
+ "items":[
+ [1,"mbones"],
+ ],
+ "cost":40,
+ },
+ "spearofthedead":{
+ "items":[
+ [2,"mbones"],
+ ],
+ "cost":40,
+ },
+ "fireblade":{
+ "items":[
+ [1,"essenceoffire"],
+ ],
+ "cost":10000,
+ },
+ "firestaff":{
+ "items":[
+ [1,"essenceoffire"],
+ ],
+ "cost":10000,
+ },
+ "firestars":{
+ "items":[
+ [1,"essenceoffire"],
+ ],
+ "cost":10000,
+ },
+ "essenceoffrost":{
+ "items":[
+ [1,"emptyjar"],
+ ],
+ "cost":10,
+ },
+ "essenceoflife":{
+ "items":[
+ [1,"emptyjar"],
+ ],
+ "cost":10,
+ },
+ "essenceoffire":{
+ "items":[
+ [1,"emptyjar"],
+ ],
+ "cost":10,
+ },
+ "essenceofnature":{
+ "items":[
+ [1,"emptyjar"],
+ ],
+ "cost":10,
+ },
+ "bronzeingot":{
+ "items":[
+ [16,"bronzenugget"],
+ ],
+ "cost":120000,
+ },
+ "goldingot":{
+ "items":[
+ [12,"goldnugget"],
+ ],
+ "cost":1200000,
+ },
+ "platinumingot":{
+ "items":[
+ [8,"platinumnugget"],
+ ],
+ "cost":12000000,
+ },
+ "lostearring":{
+ "items":[
+ [0.12,"goldnugget"],
+ ],
+ "cost":36000,
+ },
+ "goldenegg":{
+ "items":[
+ [1,"goldnugget"],
+ [0.5,"goldnugget"],
+ ],
+ "cost":120000,
+ },
+ "molesteeth":{
+ "items":[
+ [0.1,"platinumnugget"],
+ ],
+ "cost":100000,
+ },
+ # "ringsj":{
+ # "items":[
+ # [1,"wshield"],
+ # [1,"wshield"],
+ # ],
+ # "cost":100000,
+ # },
+ # "offering":{
+ # "items":[
+ # [1,"emptyjar"],
+ # ],
+ # "cost":20,
+ # },
+}
\ No newline at end of file
diff --git a/design/skills.py b/design/skills.py
new file mode 100644
index 0000000..3720a60
--- /dev/null
+++ b/design/skills.py
@@ -0,0 +1,1176 @@
+from design.conditions import conditions
+
+skills={
+ #Monsters
+ "portal":{
+ "type":"monster",
+ "name":"Portal",
+ "explanation":"Open a portal to different maps and instances",
+ },
+ "self_healing":{
+ "type":"monster",
+ "name":"Healing",
+ "explanation":"Periodical self healing",
+ },
+ "healing":{
+ "type":"monster",
+ "name":"Healing",
+ "explanation":"Heals an ally or self",
+ },
+ "anger":{
+ "type":"monster",
+ "name":"Anger",
+ "explanation":"Randomly targets someone",
+ "hostile":True,
+ },
+ "zap":{
+ "type":"monster",
+ "name":"Zap",
+ "explanation":"Zaps you with a pure damage ray",
+ "damage":1200,
+ "hostile":True,
+ "projectile":"sburst",
+ "damage_type":"pure",
+ },
+ "fireball":{
+ "type":"monster",
+ "name":"Fireball",
+ "explanation":"Hurls a fireball!",
+ "damage":4000,
+ "hostile":True,
+ "projectile":"magic",
+ "damage_type":"magical",
+ },
+ "frostball":{
+ "type":"monster",
+ "name":"Frostball",
+ "explanation":"Hurls a frostball!",
+ "damage":800,
+ "hostile":True,
+ "projectile":"frostball",
+ "damage_type":"magical",
+ },
+ "warpstomp":{
+ "type":"monster",
+ "name":"Warpstomp",
+ "explanation":"Warps to a random player nearby and stomps players in vicinity",
+ "hostile":True,
+ },
+ "deepfreeze":{
+ "type":"monster",
+ "name":"Deepfreeze",
+ "explanation":"Randomly freezes a nearby opponent",
+ "damage":1200,
+ "hostile":True,
+ "projectile":"burst",
+ "damage_type":"pure",
+ },
+ "multi_burn":{
+ "type":"monster",
+ "name":"Multi Burn",
+ "explanation":"Hurl a fireball at everyone who dared attack him and burn them!",
+ "ui":True,
+ "hostile":True,
+ "skin":"essenceoffire",
+ "damage_type":"magical",
+ },
+ "mlight":{
+ "type":"monster",
+ "name":"Light",
+ "explanation":"Reveals invisible entities nearby and prevents them from going invisible again for 12 seconds.",
+ "ui":True,
+ "hostile":True,
+ "skin":"skill_light",
+ },
+ "dampening_aura":{
+ "type":"monster",
+ "name":"Dampening",
+ "explanation":"Prevents teleports",
+ "condition":"dampened",
+ "aura":True,
+ "hostile":True,
+ "passive":True,
+ "skin":"condition_neutral",
+ },
+ "weakness_aura":{
+ "type":"monster",
+ "name":"Weakness",
+ "explanation":"Weakens",
+ "condition":"weakness",
+ "aura":True,
+ "hostile":True,
+ "passive":True,
+ "skin":"condition_bad",
+ },
+ "curse_aura":{
+ "type":"monster",
+ "name":"Curse",
+ "explanation":"A wretched aura",
+ "condition":"cursed",
+ "aura":True,
+ "hostile":True,
+ "passive":True,
+ "skin":"condition_bad",
+ },
+ "multi_freeze":{
+ "type":"monster",
+ "name":"Multi Freeze",
+ "explanation":"Hurl a frostball at everyone who dared attack him and freeze them!",
+ "hostile":True,
+ "ui":True,
+ "skin":"essenceoffrost",
+ "damage_type":"magical",
+ },
+ "mtangle":{
+ "type":"monster",
+ "name":"Tangle",
+ "explanation":"Communicates through spores to activate dormant plants underneath. Slows down opponents significantly.",
+ "mp":360,
+ "range":480,
+ "cooldown":40000,
+ "duration":5000,
+ "condition":"tangled",
+ "target":True,
+ "monsters":True,
+ "hostile":True,
+ },
+ "stone":{
+ "type":"monster",
+ "name":"Stone",
+ "explanation":"Looking into his eye for too long turns you to stone!",
+ "condition":"stoned",
+ "hostile":True,
+ },
+ #Players
+ "snowball":{
+ "type":"skill",
+ "skin":"snowball",
+ "inventory":["snowball"],
+ "name":"Snowball",
+ "explanation":"Throw a snowball at someone!",
+ "condition":"frozen",
+ "damage":1,
+ "mp":120,
+ "cooldown":180,
+ "range":720,
+ "projectile":"snowball",
+ "target":True,
+ "merchant_use":True,
+ },
+ "scare":{
+ "type":"skill",
+ "skin":"skill_scare",
+ "slot":[["orb","jacko"]],
+ "name":"Scare",
+ "explanation":"Activate your Jack-o Lantern to scare away monsters targeting you!",
+ "mp":50,
+ "cooldown":5000,
+ },
+ "power":{
+ "type":"skill",
+ "skin":"powerglove",
+ "slot":[["gloves","powerglove"]],
+ "name":"Power",
+ "explanation":"Unleash the power",
+ "mp":320,
+ "cooldown":500,
+ "condition":"power",
+ },
+ "xpower":{
+ "type":"skill",
+ "skin":"goldenpowerglove",
+ "slot":[["gloves","goldenpowerglove"]],
+ "name":"Power",
+ "explanation":"Unleash the power",
+ "mp":320,
+ "cooldown":500,
+ "condition":"xpower",
+ },
+ "warp":{
+ "type":"skill",
+ "skin":"warpvest",
+ "slot":[["chest","warpvest"]],
+ "name":"Warp",
+ "explanation":"Warp space to jump into any location",
+ "mp":40,
+ "cooldown":200,
+ },
+ "zapperzap":{
+ "type":"skill",
+ "skin":"trigger",
+ "slot":[["ring1","zapper"],["ring2","zapper"]],
+ "name":"Zap",
+ "explanation":"Zap your target for 200 damage",
+ "damage":200,
+ "damage_type":"magical",
+ "mp":140,
+ "cooldown":200,
+ "range":420,
+ "projectile":"gburst",
+ "target":True,
+ "hostile":True,
+ },
+ "charm":{
+ "type":"skill",
+ "skin":"charmer",
+ "slot":[["orb","charmer"]],
+ "name":"Charm",
+ "explanation":"Charm a monster [%]",
+ "condition":"charmed",
+ "mp":40,
+ "cooldown":60000,
+ "target":"monster",
+ "hostile":True,
+ },
+ "tangle":{
+ "type":"skill",
+ "skin":"heartwood",
+ "slot":[["mainhand","heartwood"],["offhand","heartwood"]],
+ "name":"Tangle",
+ "explanation":"Unleash the contained powers of nature to hinder an opponent.",
+ "mp":40,
+ "cooldown":60000,
+ "target":True,
+ "hostile":True,
+ },
+ "rspeed":{
+ "type":"skill",
+ "skin":"buff_speed",
+ "condition":"rspeed",
+ "class":["rogue"],
+ "name":"Rogue Swiftness",
+ "explanation":"Buff a target to increase their speed.",
+ "mp":320,
+ "range":320,
+ "level":40,
+ "cooldown":100,
+ "target":"player",
+ },
+ "reflection":{
+ "type":"skill",
+ "skin":"buff_reflection",
+ "condition":"reflection",
+ "class":["mage"],
+ "name":"Reflective Shield",
+ "explanation":"Erects a magical shield around the target to grant them +20% Reflection for the duration.",
+ "mp":540,
+ "range":320,
+ "level":60,
+ "cooldown":30000,
+ "target":"player",
+ },
+ "pickpocket":{
+ "type":"skill",
+ "skin":"skill_pickpocket",
+ "class":["rogue"],
+ "name":"Pickpocket",
+ "explanation":"Try to steal a single PVP marked item from the target!",
+ "range":15,
+ "level":16,
+ "mp":10,
+ "reuse_cooldown":2*60*1000,
+ "duration_min":200,
+ "duration_max":2000,
+ "target":"player",
+ "persistent":True,
+ },
+ "fishing":{
+ "type":"skill",
+ "skin":"skill_fishing",
+ "class":["merchant"],
+ "wtype":["rod"],
+ "name":"Fishing",
+ "explanation":"Swing your rod and catch some fish!",
+ "range":15,
+ "level":16,
+ "mp":120,
+ "reuse_cooldown":48*60*1000,
+ "duration_min":5000,
+ "duration_max":15000,
+ "persistent":True,
+ },
+ "mining":{
+ "type":"skill",
+ "skin":"skill_mining",
+ "class":["merchant"],
+ "wtype":["pickaxe"],
+ "name":"Mining",
+ "explanation":"Use your pickaxe to mine some mines!",
+ "range":15,
+ "level":16,
+ "mp":120,
+ "reuse_cooldown":124*60*1000,
+ "duration_min":5000,
+ "duration_max":15000,
+ "persistent":True,
+ },
+ "mluck":{
+ "type":"skill",
+ "skin":"buff_luck",
+ "condition":"mluck",
+ "class":["merchant"],
+ "name":"Merchant's Luck",
+ "explanation":"Buff a target to increase their luck. 2% chance for you to receive a duplicate of their looted items!",
+ "level":40,
+ "mp":10,
+ "range":320,
+ "cooldown":100,
+ "target":"player",
+ },
+ "mcourage":{
+ "type":"skill",
+ "skin":"skill_mcourage",
+ "condition":"mcourage",
+ "class":["merchant"],
+ "name":"Merchant's Courage",
+ "explanation":"When you sense danger, you know what to do...",
+ "level":70,
+ "mp":2400,
+ "cooldown":2000,
+ },
+ "mfrenzy":{
+ "type":"skill",
+ "skin":"skill_mfrenzy",
+ "condition":"mfrenzy",
+ "class":["merchant"],
+ "name":"Merchant's Frenzy",
+ "explanation":"When you sense danger, you know what to do!",
+ "level":85,
+ "mp":400,
+ "cooldown":20000,
+ },
+ "massproduction":{
+ "type":"skill",
+ "skin":"skill_massproduction",
+ "condition":"massproduction",
+ "class":["merchant"],
+ "name":"Mass Production",
+ "explanation":"Adds a 1-time use buff that speeds up the next upgrade or compound by 50%. The buff expires in 10 seconds if not used.",
+ "level":30,
+ "mp":20,
+ "cooldown":50,
+ },
+ "massproductionpp":{
+ "type":"skill",
+ "skin":"skill_massproductionpp",
+ "condition":"massproductionpp",
+ "class":["merchant"],
+ "name":"Mass Production++",
+ "explanation":"Adds a 1-time use buff that speeds up the next upgrade or compound by 90%. The buff expires in 10 seconds if not used.",
+ "level":60,
+ "mp":200,
+ "cooldown":50,
+ },
+ "throw":{
+ "type":"skill",
+ "skin":"skill_throw",
+ "class":["merchant"],
+ "name":"Throw Stuff",
+ "explanation":"Terrified? Just throw whatever you can find at your opponent!",
+ "range":200,
+ "code":"range=character.level+200",
+ "positive":["essenceoflife"],
+ "negative":["essenceoffire"],
+ "nprop":["attack","armor"],
+ "damage_type":"physical",
+ "level":60,
+ "mp":200,
+ "cooldown":400,
+ "hostile":True,
+ "target":True,
+ "pierces_immunity":True,
+ },
+ "burst":{
+ "type":"skill",
+ "skin":"skill_burst",
+ "class":["mage"],
+ "name":"Mana Burst",
+ "explanation":"Converts your entire mana pool to pure damage. Deals 0.555 pure damage for each MP.",
+ "mp":0,
+ "ratio":0.555,
+ "cooldown":6000,
+ "target":True,
+ "damage_type":"pure",
+ "hostile":True,
+ "projectile":"burst",
+ "use_range":True,
+ },
+ "cburst":{
+ "type":"skill",
+ "skin":"skill_cburst",
+ "class":["mage"],
+ "name":"Controlled Mana Burst",
+ "level":75,
+ "explanation":"A skill for experienced mages. Allows you to control and channel your most powerful ability.",
+ "mp":80,
+ "ratio":0.5,
+ "cooldown":240,
+ "list":True,
+ "hostile":True,
+ "projectile":"burst",
+ "use_range":True,
+ "damage_type":"magical",
+ },
+ "energize":{
+ "type":"skill",
+ "skin":"skill_energize",
+ "class":["mage"],
+ "name":"Energize",
+ "range":320,
+ "level":20,
+ "explanation":"Transfers mana to a target. As a side effect the target gains high attack speed for a short duration.",
+ "cooldown":4000,
+ "condition":"energized",
+ "target":"player",
+ },
+ "light":{
+ "type":"skill",
+ "skin":"skill_light",
+ "class":["mage"],
+ "name":"Light",
+ "explanation":"Reveals invisible entities nearby and prevents them from going invisible again for 12 seconds.",
+ "mp":2000,
+ "cooldown":0,
+ "hostile":True,
+ },
+ "blink":{
+ "type":"skill",
+ "skin":"skill_blink",
+ "class":["mage"],
+ "name":"Blink",
+ "explanation":"Teleport to a nearby location.",
+ "mp":1600,
+ "cooldown":1200,
+ },
+ "magiport":{
+ "type":"skill",
+ "skin":"skill_teleport",
+ "class":["mage"],
+ "name":"Magiport",
+ "explanation":"Pull someone to your location using the magical paths that surround our world.",
+ "complementary":"Unless the target doesn't have a T2+ helmet, high intelligence, or a low level, it can't resist being magiported. (Reverted [03/07/18])",
+ "mp":900,
+ "cooldown":0,
+ "target":"player",
+ "global":True,
+ },
+ "charge":{
+ "type":"skill",
+ "skin":"skill_charge",
+ "class":["warrior"],
+ "name":"Charge",
+ "explanation":"Gain 30 Speed for a short duration.",
+ "mp":0,
+ "condition":"charging",
+ "cooldown":40000,
+ },
+ "dash":{
+ "type":"skill",
+ "skin":"skill_dash",
+ "class":["warrior"],
+ "name":"Dash",
+ "explanation":"Push forward, jumping over obstacles, climbing hills, defying physics!",
+ "mp":120,
+ "set_speed":500,
+ "cooldown":0,
+ },
+ "taunt":{
+ "type":"skill",
+ "skin":"skill_taunt",
+ "class":["warrior"],
+ "name":"Taunt",
+ "explanation":"Taunts an enemy. Steals aggro from friendly targets.", #Prevents players from escaping in pvp.
+ "range":200,
+ "mp":40,
+ "cooldown":3000,
+ "damage":1,
+ "target":True,
+ "hostile":True,
+ "projectile":"stone",
+ "pierces_immunity":True,
+ },
+ "agitate":{
+ "type":"skill",
+ "skin":"skill_agitate",
+ "class":["warrior"],
+ "name":"Agitate",
+ "explanation":"Taunts all nearby monsters.",
+ "range":320,
+ "level":68,
+ "mp":420,
+ "cooldown":2200,
+ "hostile":True,
+ },
+ "hardshell":{
+ "type":"skill",
+ "skin":"skill_hardshell",
+ "class":["warrior"],
+ "name":"Hard Shell",
+ "explanation":"Use everything at your disposal to protect yourself from physical attacks for a short duration.",
+ "condition":"hardshell",
+ "level":60,
+ "mp":480,
+ "cooldown":16000,
+ },
+ "cleave":{
+ "type":"skill",
+ "skin":"skill_cleave",
+ "class":["warrior"],
+ "wtype":["axe","scythe"],
+ "name":"Cleave",
+ "explanation":"Swing your axe in a flurry to damage all enemies nearby!",
+ "range":160,
+ "level":52,
+ "mp":720,
+ "cooldown":1200,
+ "hostile":True,
+ "pierces_immunity":True,
+ "damage_type":"physical",
+ "procs":True,
+ },
+ "stomp":{
+ "type":"skill",
+ "skin":"skill_stomp",
+ "class":["warrior"],
+ "wtype":"basher",
+ "name":"Stomp",
+ "explanation":"Use your basher to Stomp the ground to Stun enemies nearby!",
+ "condition":"stunned",
+ "range":400,
+ "level":52,
+ "mp":120,
+ "cooldown":24000,
+ "duration":3200,
+ "hostile":True,
+ "damage_type":"physical",
+ },
+ "warcry":{
+ "type":"skill",
+ "skin":"skill_warcry",
+ "class":["warrior"],
+ "name":"War Cry",
+ "explanation":"Motivate your allies to fight!",
+ "level":70,
+ "mp":320,
+ "range":600,
+ "cooldown":60000,
+ "condition":"warcry",
+ },
+ "poisonarrow":{
+ "type":"skill",
+ "skin":"skill_poisonarrow",
+ "class":["ranger"],
+ "name":"Poison Arrow",
+ "explanation":"Fire a single low damage but poison coated arrow at your opponent.",
+ "wtype":["bow","crossbow"],
+ "cooldown":300,
+ "damage":200,
+ "mp":360,
+ "consume":"poison",
+ "target":True,
+ "hostile":True,
+ "use_range":True,
+ "projectile":"poisonarrow",
+ "damage_type":"physical",
+ "condition":"poisoned",
+ "procs":True,
+ },
+ "piercingshot":{
+ "type":"skill",
+ "skin":"skill_piercingshot",
+ "class":["ranger"],
+ "name":"Piercing Shot",
+ "explanation":"Fire heavy, armor piercing arrows at your opponent. They deal 75% of the damage but pierce through 500 armor.",
+ "wtype":["bow","crossbow"],
+ "apiercing":500,
+ "damage_multiplier":0.75,
+ "mp":64,
+ "level":72,
+ "cooldown_multiplier":1,
+ "share":"attack",
+ "use_range":True,
+ "target":True,
+ "hostile":True,
+ "damage_type":"physical",
+ "procs":True,
+ "pierces_immunity":True,
+ },
+ "huntersmark":{
+ "type":"skill",
+ "skin":"skill_huntersmark",
+ "class":["ranger"],
+ "name":"Hunter's Mark",
+ "explanation":"Mark an opponent for death, prevent them from stealthing away and increase damage done by 10%",
+ "mp":240,
+ "condition":"marked",
+ "cooldown":10000,
+ "target":True,
+ "hostile":True,
+ },
+ "pcoat":{
+ "type":"skill",
+ "skin":"skill_pcoat",
+ "class":["rogue"],
+ "name":"A Poisonous Touch",
+ "explanation":"Coat your blade with a poison sack. Poison everyone you damage before the venom dissipates.",
+ "condition":"poisonous",
+ "cooldown":50000,
+ "duration":7000,
+ "mp":600,
+ "consume":"poison",
+ },
+ "invis":{
+ "type":"skill",
+ "skin":"skill_invis",
+ "class":["rogue"],
+ "name":"Assassin's Smoke",
+ "explanation":"Disappear into the shadows. Deal 1.25X damage when you sneak up on an enemy. Cooldown starts when you re-appear.",
+ "reuse_cooldown":12000,
+ },
+ "mentalburst":{
+ "type":"skill",
+ "skin":"skill_mentalburst",
+ "class":["rogue"],
+ "name":"Mental Burst",
+ "explanation":"Channel your mental abilities for a magical blow. If the target is defeated, the damage dealt is converted to mana.",
+ "damage_type":"magical",
+ "cooldown":900,
+ "damage_multiplier":0.6,
+ "range_multiplier":1.2,
+ "range_bonus":32,
+ "mp":180,
+ "target":True,
+ "requirements":{"int":64},
+ "warning":"Highly unbalanced skill, could get nerfed or modified",
+ "hostile":True,
+ "projectile":"mentalburst",
+ },
+ "quickpunch":{
+ "type":"skill",
+ "skin":"skill_quickpunch",
+ "class":["rogue"],
+ "name":"Quick Punch",
+ "explanation":"Use your agility to quickly punch your opponent between your devastating attacks!",
+ "wtype":"fist",
+ "cooldown":250,
+ "damage_multiplier":0.25,
+ "mp":240,
+ "use_range":True,
+ "target":True,
+ "hostile":True,
+ "projectile":"quickpunch",
+ "damage_type":"physical",
+ "pierces_immunity":True,
+ #"procs":True,
+ },
+ "quickstab":{
+ "type":"skill",
+ "skin":"skill_quickstab",
+ "class":["rogue"],
+ "name":"Quick Stab",
+ "explanation":"Use your agility to quickly stab your opponent between your devastating attacks!",
+ "wtype":"dagger",
+ "cooldown":250,
+ "share":"quickpunch",
+ "damage_multiplier":0.36,
+ "mp":320,
+ "use_range":True,
+ "target":True,
+ "hostile":True,
+ "projectile":"quickstab",
+ "damage_type":"physical",
+ "procs":True,
+ "pierces_immunity":True,
+ },
+ "stack":{
+ "type":"passive",
+ "skin":"skill_stack",
+ "class":["rogue"],
+ "name":"Stacked Damage",
+ "explanation":"Slowly learning the ways of your opponent each rogue attack deals one more damage.",
+ "max":2000,
+ },
+ "shadowstrike":{
+ "type":"skill",
+ "skin":"skill_shadowstrike",
+ "class":["rogue"],
+ "name":"Shadow Strike",
+ "explanation":"Use a shadow stone to strike a random enemy in a parallel universe!",
+ "range":360,
+ "level":70,
+ "mp":320,
+ "cooldown":1200,
+ "consume":"shadowstone",
+ "hostile":True,
+ "damage_type":"physical",
+ },
+ "entangle":{
+ "type":"skill",
+ "skin":"skill_entangle",
+ "class":["mage"],
+ "name":"Entangle",
+ "explanation":"Unleash the contained powers of nature to hinder an opponent.",
+ "level":72,
+ "mp":360,
+ "range":480,
+ "cooldown":40000,
+ "duration":5000,
+ "condition":"tangled",
+ "target":True,
+ "monsters":True,
+ "consume":"essenceofnature",
+ "hostile":True,
+ },
+ "track":{
+ "type":"skill",
+ "skin":"skill_track",
+ "class":["ranger"],
+ "name":"Track",
+ "explanation":"Use your fine-tuned senses to detect others.",
+ "cooldown":1600,
+ "range":1440,
+ "mp":80,
+ },
+ "supershot":{
+ "type":"skill",
+ "skin":"skill_supershot",
+ "class":["ranger"],
+ "name":"Supershot",
+ "explanation":"Deals 1.5X instant damage from an incredible distance.",
+ "wtype":["bow","crossbow"],
+ "damage_multiplier":1.5,
+ "cooldown":30000,
+ "range_multiplier":3,
+ "mp":400,
+ "target":True,
+ "hostile":True,
+ "pierces_immunity":True,
+ "damage_type":"physical",
+ "procs":True,
+ },
+ "3shot":{
+ "type":"skill",
+ "skin":"skill_3shot",
+ "class":["ranger"],
+ "name":"3-Shot",
+ "explanation":"Hits 3 targets at once! Deals 0.7X damage to each target.",
+ "wtype":["bow","crossbow"],
+ "damage_multiplier":0.7,
+ "level":60,
+ "mp":200,
+ "cooldown_multiplier":1,
+ "multi":True,
+ "share":"attack",
+ "hostile":True,
+ "pierces_immunity":True,
+ "damage_type":"physical",
+ "procs":True,
+ "use_range":True,
+ },
+ "5shot":{
+ "type":"skill",
+ "skin":"skill_5shot",
+ "class":["ranger"],
+ "name":"5-Shot",
+ "explanation":"Hits 5 targets at once! Deals 0.5X damage to each target.",
+ "wtype":["bow","crossbow"],
+ "damage_multiplier":0.5,
+ "level":75,
+ "mp":320,
+ "cooldown_multiplier":1,
+ "multi":True,
+ "share":"attack",
+ "hostile":True,
+ "pierces_immunity":True,
+ "damage_type":"physical",
+ "procs":True,
+ "use_range":True,
+ },
+ "4fingers":{
+ "type":"skill",
+ "skin":"skill_4fingers",
+ "class":["ranger"],
+ "name":"4 Finger Technique",
+ "explanation":"Use the ancient arts to send the target to a deep meditation state. Just several taps to key chakra points does the job!",
+ "level":64,
+ "mp":260,
+ "range":120,
+ "cooldown":40000,
+ "duration":5000,
+ "condition":"fingered",
+ "target":"player",
+ "monsters":False,
+ "hostile":True,
+ },
+ "curse":{
+ "type":"skill",
+ "skin":"skill_curse",
+ "class":["priest"],
+ "name":"Curse",
+ "explanation":"Cursed opponents receive 20% more damage, deal 20% less damage and they slow down by 20.",
+ "mp":400,
+ "duration":5000,
+ "cooldown":5000,
+ "condition":"cursed",
+ "target":True,
+ "hostile":True,
+ "projectile":"curse",
+ "damage_type":"magical",
+ },
+ "phaseout":{
+ "type":"skill",
+ "skin":"skill_phaseout",
+ "class":["priest"],
+ "name":"Phase Out",
+ "explanation":"Absorb a shadow stone to phase yourself out from this universe.",
+ "level":64,
+ "duration":5000,
+ "cooldown":4000,
+ "mp":200,
+ "consume":"shadowstone",
+ "condition":"phasedout",
+ },
+ "darkblessing":{
+ "type":"skill",
+ "skin":"skill_dbuff",
+ "class":["priest"],
+ "name":"Dark Blessing",
+ "explanation":"Increases damage by 25% for the duration.",
+ "level":70,
+ "mp":900,
+ "range":600,
+ "duration":8000,
+ "cooldown":60000,
+ "condition":"darkblessing",
+ },
+ "absorb":{
+ "type":"skill",
+ "skin":"skill_absorbsins",
+ "class":["priest"],
+ "name":"Absorb Sins",
+ "explanation":"Pulls all targets from a friendly character.",
+ "range":240,
+ "cooldown":400,
+ "mp":200,
+ "level":55,
+ "target":"player",
+ },
+ "partyheal":{
+ "type":"skill",
+ "skin":"skill_pheal",
+ "class":["priest"],
+ "name":"Party Heal",
+ "explanation":"Heals all the party members.",
+ "output":400,
+ "action":"heal",
+ "levels":[
+ [0,500],
+ [60,600],
+ [72,720],
+ [80,800],
+ ],
+ "mp":400,
+ "cooldown":200,
+ "party":True,
+ "projectile":"partyheal",
+ "damage_type":"magical",
+ "heal":True,
+ "multi":True,
+ },
+ "selfheal":{
+ "type":"skill",
+ "skin":"skill_selfheal",
+ "class":["paladin"],
+ "name":"Heal",
+ "explanation":"Heal yourself",
+ "output":400,
+ "action":"heal",
+ "levels":[
+ [0,500],
+ [60,600],
+ [72,720],
+ [80,800],
+ ],
+ "mp":20,
+ "cooldown":1200,
+ "projectile":"partyheal",
+ "damage_type":"magical",
+ "heal":True,
+ },
+ "mshield":{
+ "type":"skill",
+ "skin":"skill_mshield",
+ "class":["paladin"],
+ "name":"Mana Shield",
+ "explanation":"Create a magical shield around yourself to absorb damage [Toggle]",
+ "condition":"mshield",
+ "toggle":True,
+ "mp":0,
+ "duration":999999999,
+ "cooldown":0,
+ },
+ "purify":{
+ "type":"skill",
+ "skin":"skill_purify",
+ "class":["paladin"],
+ "name":"Purify",
+ "level":60,
+ "damage":2000,
+ "damage_type":"pure",
+ "explanation":"Deals 2000 pure damage purifying the target, removes all buffs and debuffs dealing additional 400 damage for each and receive the Purifier buff if the target is defeated!",
+ "kill_buff":"purifier",
+ "projectile":"purify",
+ "hostile":True,
+ "target":True,
+ "mp":360,
+ "cooldown":24000,
+ "range":480,
+ },
+ "smash":{
+ "type":"skill",
+ "skin":"skill_smash",
+ "class":["paladin"],
+ "name":"Smash",
+ "explanation":"Smash your opponent using your mace!",
+ "wtype":"mace",
+ "cooldown":320,
+ "level":10,
+ "damage_multiplier":0.36,
+ "mp":380,
+ "use_range":True,
+ "target":True,
+ "hostile":True,
+ "projectile":"smash",
+ "damage_type":"physical",
+ "procs":True,
+ "pierces_immunity":True,
+ },
+ "alchemy":{
+ "type":"skill",
+ "skin":"skill_alchemy",
+ "class":["mage"],
+ "name":"Alchemy",
+ "explanation":"Dangerous skill, use with caution! Converts your firstfound item into pure gold!",
+ "variance":0.2,
+ "output":0.8,
+ "action":"rate",
+ "levels":[
+ [40,0.8],
+ [50,0.86],
+ [60,0.92],
+ [70,1.0],
+ [80,1.06],
+ [90,1.10],
+ [100,1.12],
+ ],
+ "level":40,
+ "mp":347,
+ "cooldown":8000,
+ "party":True,
+ },
+ "revive":{
+ "type":"skill",
+ "skin":"skill_revive",
+ "class":["priest"],
+ "name":"Revive!",
+ "explanation":"If a fallen comrade's gravestone has been healed fully, revives them using an Essence of Life!",
+ "mp":500,
+ "cooldown":200,
+ "range":240,
+ "consume":"essenceoflife",
+ "target":"player",
+ },
+ "regen_hp":{
+ "type":"ability",
+ "skin":"regen_hp",
+ "name":"Regenerate HP",
+ "share":"use_hp",
+ "cooldown_multiplier":2,
+ "explanation":"Regenerate 50 HP without using potions.",
+ },
+ "regen_mp":{
+ "type":"ability",
+ "skin":"regen_mp",
+ "name":"Regenerate MP",
+ "share":"use_mp",
+ "cooldown_multiplier":2,
+ "explanation":"Regenerate 100 MP without using potions.",
+ },
+ "use_mp":{
+ "type":"ability",
+ "skin":"use_mp",
+ "name":"Use MP Potion",
+ "explanation":"Uses an MP potion from your inventory. If there are multiple potions, the last one is used. If there are no potions, your character regenerates a small amount of MP with a high cooldown.",
+ "cooldown":2000,
+ },
+ "use_hp":{
+ "type":"ability",
+ "skin":"use_hp",
+ "name":"Use HP Potion",
+ "explanation":"Uses an HP potion from your inventory. If there are multiple potions, the last one is used. If there are no potions, your character regenerates a small amount of HP with a high cooldown.",
+ "cooldown":2000,
+ },
+ "use_town":{
+ "type":"ability",
+ "skin":"use_town",
+ "name":"Town",
+ "explanation":"Teleports you to the center of the map.",
+ "cooldown":0,
+ },
+ "attack":{
+ "type":"ability",
+ "skin":"attack",
+ "name":"Attack",
+ "explanation":"Attack the target",
+ "target":True,
+ "hostile":True,
+ "pierces_immunity": True,
+ "use_range":True,
+ "projectile":"momentum",
+ "procs":True,
+ },
+ "heal":{
+ "type":"ability",
+ "skin":"heal",
+ "name":"Heal",
+ "class":["priest"],
+ "explanation":"Heal the target",
+ "cooldown_multiplier":1,
+ "share":"attack",
+ "target":True,
+ "use_range":True,
+ "pierces_immunity": True,
+ "projectile":"plight",
+ "damage_type":"magical",
+ "heal":True,
+ "procs":True,
+ },
+ "travel":{
+ "type":"ability",
+ "skin":"travel",
+ "name":"Travel!",
+ "explanation":"Where would you like to visit?",
+ },
+ "stop":{
+ "type":"ability",
+ "skin":"stop_g",
+ "name":"Stop",
+ "explanation":"Stops your character. Cancels all channeling abilities and active skills.",
+ "cooldown":0,
+ },
+ "snippet":{
+ "type":"utility",
+ "skin":"run_snippet1",
+ "name":"Snippet",
+ "explanation":"Maps a code snippet to a keypress.",
+ "skins":["run_snippet0","run_snippet1","run_snippet2"],
+ "code":True,
+ },
+ "emotion":{
+ "type":"utility",
+ "skin":"run_emotion",
+ "name":"Emotion",
+ "explanation":"Show a random emotion you've unlocked!",
+ },
+ "pure_eval":{
+ "type":"utility",
+ "skin":"run_eval0",
+ "name":"Pure Eval",
+ "explanation":"[Advanced] Maps a code snippet to be run directly inside the game, rather than using CODE. (Not to be confused with the text command, /eval, which evals inside the Code iframe)",
+ "skins":["run_eval0","run_eval1","run_eval2"],
+ "code":True,
+ },
+ "esc":{
+ "type":"utility",
+ "skin":"esc",
+ "name":"ESC",
+ "explanation":"Calls the esc_pressed() function inside the game. Major functionality.",
+ "ui":False,
+ },
+ "move_up":{
+ "type":"utility",
+ "skin":"up",
+ "name":"Move Up",
+ "explanation":"Moves the character upwards",
+ "ui":False,
+ },
+ "move_down":{
+ "type":"utility",
+ "skin":"down",
+ "name":"Move Down",
+ "explanation":"Moves the character downwards",
+ "ui":False,
+ },
+ "move_left":{
+ "type":"utility",
+ "skin":"left",
+ "name":"Move Left",
+ "explanation":"Moves the character leftwards",
+ "ui":False,
+ },
+ "move_right":{
+ "type":"utility",
+ "skin":"right",
+ "name":"Move Right",
+ "explanation":"Moves the character rightwards",
+ "ui":False,
+ },
+ "toggle_code":{
+ "skin":"code",
+ "name":"Toggle Code",
+ "ui":False,
+ },
+ "toggle_run_code":{
+ "skin":"run_code",
+ "name":"Engage/Disengage Code",
+ "ui":False,
+ },
+ "toggle_inventory":{
+ "type":"utility",
+ "skin":"inventory",
+ "name":"Toggle Inventory",
+ "explanation":"Toggles the inventory",
+ "ui":False,
+ },
+ "toggle_stats":{
+ "type":"utility",
+ "skin":"stats",
+ "name":"Toggle Stats",
+ "explanation":"Toggles the character sheet",
+ "ui":False,
+ },
+ "toggle_character":{
+ "type":"utility",
+ "skin":"character",
+ "name":"Toggle Character",
+ "explanation":"Toggles the character focus",
+ "ui":False,
+ },
+ "open_snippet":{
+ "type":"utility",
+ "skin":"snippet",
+ "name":"Open Snippet",
+ "explanation":"Open the Code Snippet interface",
+ "ui":False,
+ },
+ "interact":{
+ "type":"utility",
+ "skin":"interact",
+ "name":"Interact",
+ "explanation":"Interact with the nearest game entity, a door, doorway, or NPC.",
+ "ui":False,
+ },
+ "gm":{
+ "type":"gm",
+ "skin":"gm",
+ "name":"GM Abilities",
+ "explanation":"Jump, Jail, Mute, Use Any Skill",
+ }
+}
+for name in skills:
+ if skills[name].has_key("condition") and not skills[name].has_key("duration") and conditions.has_key(skills[name]["condition"]) and conditions[skills[name]["condition"]]:
+ try:
+ skills[name]["duration"]=conditions[skills[name]["condition"]]["duration"]
+ except:
+ import logging
+ logging.error("%s has no duration"%conditions[skills[name]["condition"]])
\ No newline at end of file
diff --git a/design/skills.txt b/design/skills.txt
new file mode 100644
index 0000000..e9f88c2
--- /dev/null
+++ b/design/skills.txt
@@ -0,0 +1,10 @@
+Warrior
+1200 MP - 50% Evasion for 4 seconds - 60 second CD
+800MP - War Cry - +10 Speed - 200 Armor - 200 Res - Party - 3 seconds - 80 second CD
+500MP - Cleave
+500MP - Stomp
+
+
+Priest
+Party Heal
+Mana Burn - Burns Mana + Damage - 60 second CD - maybe DOT
\ No newline at end of file
diff --git a/design/sprites.py b/design/sprites.py
new file mode 100644
index 0000000..22a5b22
--- /dev/null
+++ b/design/sprites.py
@@ -0,0 +1,1139 @@
+sprites={
+ "test":{
+ #"ignore":True,
+ "file":"/images/tiles/characters/ninja_turtles.png",
+ "rows":1,
+ "columns":4,
+ "matrix":[
+ #["test"],
+ ["t1","test","t3","t4"],
+ ]
+ },
+ "makeup1":{
+ "file":"/images/cosmetics/makeup/makeup1.png?v=6",
+ "rows":1,
+ "columns":42,
+ "type":"head",
+ "matrix":[[]], #looped below
+ },
+ "bwhair":{
+ "file":"/images/cosmetics/hairdo/bwhair.png?v=2",
+ "rows":1,
+ "columns":1,
+ "type":"hair",
+ "matrix":[["bwhair"]],
+ },
+ "burningeyes1":{
+ "file":"/images/cosmetics/beardo/burningeyes1_anim.png",
+ "rows":1,
+ "columns":1,
+ "type":"a_makeup",
+ "matrix":[["breyes"]],
+ },
+ "burningeyes2":{
+ "file":"/images/cosmetics/beardo/burningeyes2_anim.png",
+ "rows":1,
+ "columns":1,
+ "type":"a_makeup",
+ "matrix":[["bbeyes"]],
+ },
+ "bathat":{
+ "file":"/images/cosmetics/hats/bathat_anim.png",
+ "rows":1,
+ "columns":1,
+ "type":"a_hat",
+ "matrix":[["bathat"]],
+ },
+ "gcandle":{
+ "file":"/images/cosmetics/hats/gcandle_anim.png",
+ "rows":1,
+ "columns":1,
+ "type":"a_hat",
+ "matrix":[["gcandle"]],
+ },
+ "halo":{
+ "file":"/images/cosmetics/hats/halo_anim.png",
+ "rows":1,
+ "columns":1,
+ "type":"a_hat",
+ "matrix":[["halo"]],
+ },
+ "kunique":{
+ "file":"/images/cosmetics/makeup/kunique.png?v=2",
+ "rows":1,
+ "columns":4,
+ "type":"head",
+ "matrix":[["bwhead","blackhead","testm1","testm2"]],
+ },
+ "mbw":{
+ "file":"/images/cosmetics/skins/mbw.png",
+ "rows":1,
+ "columns":1,
+ "type":"skin",
+ "size":"normal",
+ "matrix":[["mbw"]],
+ },
+ "mabw":{
+ "file":"/images/cosmetics/armors/mabw.png?v=2",
+ "rows":1,
+ "columns":2,
+ "type":"armor",
+ "size":"normal",
+ "matrix":[["mabw","nothing"]],
+ },
+ "kglasses":{
+ "file":"/images/cosmetics/accessories/kglasses.png?v=3",
+ "rows":1,
+ "columns":4,
+ "type":"face",
+ "matrix":[["bwglasses","tortoise_g","catbatg","coolblueg"]],
+ },
+ "gravestones":{
+ "rskip":True,
+ "file":"/images/cosmetics/gravestones/gravestone.png",
+ "rows":2,
+ "columns":10,
+ "type":"gravestone",
+ "matrix":[
+ ["gravestonea","gravestone","xgravestone0","xgravestone1","xgravestone2","xgravestone3","xgravestone4",None,None,None],
+ [None,None,None,None,None,None,None,None,None,None],
+ ]
+ },
+ "deepsea":{
+ #"ignore":True,
+ "file":"/images/tiles/monsters/deep_sea_king.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["deepsea"],
+ #["t1","test","t3","t4"],
+ ]
+ },
+ "adversaries":{
+ #"ignore":True,
+ "file":"/images/tiles/characters/adversaries.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["a1","a2","a3","a4"],
+ ["a5","a6","a7","a8"],
+ ]
+ },
+ "angel_wingless":{
+ "file":"/images/tiles/characters/angel_wingless.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"bangel",None,None],
+ [None,None,None,None],
+ ]
+ },
+ "jpa":{
+ "file":"/images/tiles/characters/winners_jpa.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"greengreen",None,None],
+ [None,None,None,None],
+ ]
+ },
+ "jpb":{
+ "file":"/images/tiles/characters/winners_jpb.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"pinkie",None,"purpo"],
+ [None,None,None,None],
+ ]
+ },
+ "swa":{
+ "file":"/images/tiles/characters/sheet_winnersa.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"scarf",None,None],
+ [None,None,"proft","twig"],
+ ]
+ },
+ "swb":{
+ "file":"/images/tiles/characters/sheet_winnersb.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,"bobo"],
+ [None,None,None,None],
+ ]
+ },
+ "collection1":{
+ "file":"/images/tiles/characters/collection1.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["daisy",None,None,None],
+ [None,None,"cunn","robbie"],
+ ]
+ },
+ "collection2":{
+ "file":"/images/tiles/characters/collection2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["sir",None,None,None],
+ [None,None,"naked",None],
+ ]
+ },
+ # "collection3":{
+ # "file":"/images/tiles/characters/collection3.png",
+ # "rows":2,
+ # "columns":4,
+ # "matrix":[
+ # [None,None,None,None],
+ # [None,None,None,None],
+ # ]
+ # },
+ "collectionx":{
+ "file":"/images/tiles/characters/collectionx.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"snow_angel",None,None],
+ ["creator",None,None,None],
+ ]
+ },
+ "snowman":{
+ "file":"/images/tiles/monsters/snowman.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["snowman"],
+ ]
+ },
+ "dragold":{
+ "file":"/images/tiles/monsters/Dragold.png?v=2",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["dragold"],
+ ]
+ },
+ "bscorpion":{
+ "file":"/images/tiles/monsters/blackscorpion.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["bscorpion"],
+ ]
+ },
+ "cobold":{
+ "file":"/images/tiles/monsters/coboldProto.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["cobold"],
+ ]
+ },
+ "ligerx":{
+ "file":"/images/tiles/monsters/liger_x.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["ligerx"],
+ ]
+ },
+ "tiger":{
+ "file":"/images/tiles/monsters/tiger.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["tiger"],
+ ]
+ },
+ "slenderman":{
+ "file":"/images/tiles/monsters/slenderman.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["slenderman"],
+ ]
+ },
+ "franky":{
+ "file":"/images/tiles/monsters/frankenstein.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["franky"],
+ ]
+ },
+ "custom1":{
+ "file":"/images/tiles/characters/custom1.png?v=11",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["mwarrior2","mranger2","fpriest","trexw"],
+ ["showoffi","bpri","mmage","enterrr"]
+ ]
+ },
+ "custom2":{
+ "file":"/images/tiles/characters/custom2.png?v=4",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["trexp",None,None,None],
+ ["konami","potiongirl","j2",None]
+ ]
+ },
+ "custom3":{
+ "file":"/images/tiles/characters/custom3.png?v=1",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["spkc","spkw","bunny","bouncer"],
+ [None,None,None,None]
+ ]
+ },
+ "jsonx":{
+ "file":"/images/tiles/characters/others/jsonX.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["jsonx"],
+ ]
+ },
+ "mechagnome":{
+ "file":"/images/tiles/monsters/mecha_gnome.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["mechagnome"],
+ ]
+ },
+ "harpy":{
+ "file":"/images/tiles/monsters/harpy_b_1.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["harpy"],
+ ]
+ },
+ "harpy_fly":{
+ "file":"/images/tiles/monsters/harpy_b_fly_1.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["harpy_fly"],
+ ]
+ },
+ "rharpy":{
+ "file":"/images/tiles/monsters/harpy_a_1.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["rharpy"],
+ ]
+ },
+ "rharpy_fly":{
+ "file":"/images/tiles/monsters/harpy_a_fly_1.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["rharpy_fly"],
+ ]
+ },
+ "ship1":{
+ "file":"/images/tiles/characters/others/ship2.png",
+ "rows":1,
+ "columns":1,
+ "type":"animation",
+ "matrix":[
+ ["ship"],
+ ]
+ },
+ "newyear_tree":{
+ "file":"/images/tiles/characters/others/newyear_tree.png",
+ "rows":1,
+ "columns":1,
+ "type":"animation",
+ "matrix":[
+ ["newyear_tree"],
+ ]
+ },
+ "bonus1":{
+ "file":"/images/tiles/characters/bonus1.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,None],
+ [None,None,"mranger","holo"],
+ ]
+ },
+ "military2":{
+ "file":"/images/tiles/characters/military2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"nexus",None,None],
+ [None,None,None,None],
+ ]
+ },
+ "military3":{
+ "file":"/images/tiles/characters/military3.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,None],
+ [None,"asoldier",None,None],
+ ]
+ },
+ "knights":{
+ "file":"/images/tiles/characters/knights.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["pknight",None,"baron",None],
+ [None,None,None,None],
+ ]
+ },
+ "chara2":{
+ "file":"/images/tiles/characters/chara2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,"thief","fxrogue"],
+ [None,None,"generalg","prince"],
+ ]
+ },
+ "chara3":{
+ "file":"/images/tiles/characters/chara3.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,"franger","lilith"],
+ [None,None,"frogue",None],
+ ]
+ },
+ "chara4":{
+ "file":"/images/tiles/characters/chara4.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"ftokener","grogue",None],
+ ["shadow","angel",None,None],
+ ]
+ },
+ "chara6":{
+ "file":"/images/tiles/characters/chara6.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["mwarrior","mnwarrior","mwarrior_cool","fpaladin"],
+ ["fkid","redhead","mrogue","mpaladin_kid"]
+ ]
+ },
+ "chara7":{
+ "file":"/images/tiles/characters/chara7.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["frozenrogue",None,"fmage",None],
+ ["marven","fwarrior","blingbling","lionsuit"]
+ ]
+ },
+ "chara8":{
+ "file":"/images/tiles/characters/chara8.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["pink","splithair","wizard","pwincess"],
+ ["greencap",None,None,None]
+ ]
+ },
+ "automatron":{
+ "file":"/images/tiles/characters/automatron2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["target_a500","target_a750","target_r500","target_r750"],
+ ["target_ar900","target_ar500red",None,"target"]
+ ]
+ },
+ "npc1":{
+ "file":"/images/tiles/characters/npc1.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["gcitizen","oldcitizen",None,None],
+ ["fisherman",None,"gemmerchant",None]
+ ]
+ },
+ "npc3":{
+ "file":"/images/tiles/characters/npc3.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"mailman",None,None],
+ [None,None,None,None]
+ ]
+ },
+ "npc4":{
+ "file":"/images/tiles/characters/npc4.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["lady1","lady2","gabrielle","gabriella"],
+ ["lady3",None,"lady4",None]
+ ]
+ },
+ "npc5":{
+ "file":"/images/tiles/characters/npc5.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["npcc","lmerchant","mmerchant","purplelady"],
+ [None,None,None,None]
+ ]
+ },
+ "npc6":{
+ "file":"/images/tiles/characters/npc6.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["showoff","fmerchant","npc63","llady"],
+ ["renaldo",None,"lucy",None]
+ ]
+ },
+ "dwarf2":{
+ "file":"/images/tiles/characters/dwarf2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,None],
+ ["fancyd",None,None,None]
+ ]
+ },
+ "tristone_m":{
+ "file":"/images/tiles/characters/tristone_m.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["tm_red","tm_brown","tm_yellow","tm_green"],
+ ["tm_gray","tm_blue","tm_purple","tm_white"]
+ ]
+ },
+ "tristone_f":{
+ "file":"/images/tiles/characters/tristone_f.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["tf_pink","tf_blue","tf_green","tf_orange"],
+ ["tf_purple",None,None,None]
+ ]
+ },
+ "mystics":{
+ "file":"/images/tiles/characters/mystics.png",
+ "rows":1,
+ "columns":4,
+ "matrix":[
+ ["mm_blue","mf_blue","mm_yellow","mf_yellow"],
+ ]
+ },
+ "creatures1":{
+ "file":"/images/tiles/monsters/creatures1.png",
+ "rows":1,"columns":4,
+ "matrix":[[None,None,"mummy","booboo"]],
+ },
+ "creatures2":{
+ "file":"/images/tiles/monsters/creatures2.png",
+ "rows":2,"columns":4,
+ "matrix":[
+ ["oneeye",None,None,None],
+ [None,None,None,None]
+ ],
+ },
+ "jrpumpkins":{
+ "file":"/images/tiles/monsters/jrpumpkins.png",
+ "rows":1,"columns":2,
+ "matrix":[["jr","greenjr"]],
+ },
+ "chara5":{
+ "file":"/images/tiles/characters/chara5.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,"thehelmet"],
+ [None,"mpriest","reaper","goblin"]
+ ]
+ },
+ "chests":{
+ "file":"/images/tiles/items/chests.png?v=2",
+ "rows":2,
+ "columns":12,
+ "matrix":[
+ ["chestp","chest1",None,None,"chest2",None,None,"chest3",None,None,"chest4",None],
+ [None,"chest5",None,None,"chest6",None,None,"chest7",None,None,"chest8",None]
+ ],
+ "type":"v_animation", #new logic [02/07/18]
+ },
+ "animationc":{
+ "file":"/images/tiles/characters/animationc.png?v=4",
+ "rows":8,
+ "columns":4,
+ "type":"animation",
+ "matrix":[
+ ["santa","pvptokens",None,None],
+ ["brewingwitch","funtokens",None,None],
+ ["test_a",None,"test_b",None],
+ [None,None,None,None],
+ [None,None,None,None],
+ [None,None,None,None],
+ [None,None,None,None],
+ [None,None,None,None]
+ ]
+ },
+ "animation1":{
+ "file":"/images/tiles/characters/animation1i.png",
+ "rows":8,
+ "columns":4,
+ "type":"animation",
+ "matrix":[
+ [None,"pflow","sidesword","flute"],
+ [None,"fancypots","pike","doublesword"],
+ [None,None,"daggers","hammer"],
+ [None,None,"swdagger","miniharp"],
+ ["bow","spell","powerup","magic"],
+ ["bow2","sth1","tricks","yellowlady"],
+ ["praise","drunk","hairs","yellowwarrior"],
+ ["femalesword","femalelongsword","scrolls","double-axe"]
+ ]
+ },
+ "animation2":{
+ "file":"/images/tiles/characters/animation2.png",
+ "rows":8,
+ "columns":4,
+ "type":"animation",
+ "matrix":[
+ ["armorguy","zengirl",None,None,],
+ [None,None,None,None,],
+ [None,None,None,None,],
+ [None,"goblin_a",None,None,],
+ [None,None,None,None,],
+ [None,None,None,None,],
+ [None,None,None,None,],
+ [None,None,None,None,]
+ ]
+ },
+ "animation3":{
+ "file":"/images/tiles/characters/animation3.png",
+ "rows":8,
+ "columns":4,
+ "type":"animation",
+ "matrix":[
+ [None,None,None,None,],
+ [None,None,None,None,],
+ [None,None,None,None,],
+ ["geekgirl",None,None,None,],
+ [None,None,None,None,],
+ [None,"exchanger",None,None,],
+ [None,None,None,None,],
+ [None,"newupgrade",None,None,]
+ ]
+ },
+ "elementals":{
+ "file":"/images/tiles/monsters/elemental.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["welemental","felemental","nelemental","eelemental"],
+ [None,None,None,None]
+ ]
+ },
+ "dknight1":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_dknight1.png",
+ "rows":1,"columns":1,"matrix":[["dknight1"]]
+ },
+ "dknight2":{
+ "file":"/images/tiles/monsters/monster_dknight2.png",
+ "rows":1,"columns":1,"matrix":[["dknight2"]]
+ },
+ "fairies":{
+ "file":"/images/tiles/monsters/fairies.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["greenfairy","redfairy","bluefairy","darkfairy"],
+ [None,None,None,None]
+ ]
+ },
+ "monsterbird1":{
+ "file":"/images/tiles/monsters/monster_bird1.png",
+ "rows":1,"columns":1,"matrix":[["bigbird"]]
+ },
+ "monsterbird2":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_bird2.png",
+ "rows":1,"columns":1,"matrix":[["blackbird"]]
+ },
+ "monsterbird3":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_bird3.png",
+ "rows":1,"columns":1,"matrix":[["turkeybird"]]
+ },
+ "boar":{
+ "file":"/images/tiles/monsters/monster_boar.png",
+ "rows":1,"columns":1,"matrix":[["boar"]]
+ },
+ "cacto":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_cacto.png",
+ "rows":1,"columns":1,"matrix":[["cactusman"]]
+ },
+ "rudolph":{
+ "file":"/images/tiles/monsters/rudolphi.png",
+ "rows":1,"columns":1,"matrix":[["rudolph"]]
+ },
+ "elk":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_elk.png",
+ "rows":1,"columns":1,"matrix":[["elk"]]
+ },
+ "golem1":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_golem1.png",
+ "rows":1,"columns":1,"matrix":[["stone_golem"]]
+ },
+ "golem2":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_golem2.png",
+ "rows":1,"columns":1,"matrix":[["tree_golem"]]
+ },
+ # "lich":{
+ # "file":"/images/tiles/monsters/monster_lich.png",
+ # "rows":1,"columns":1,"matrix":[["lich"]]
+ # },
+ "lizardman1":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_lizardman1.png",
+ "rows":1,"columns":1,"matrix":[["greenlizardman"]]
+ },
+ "lizardman2":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_lizardman2.png",
+ "rows":1,"columns":1,"matrix":[["redlizardman"]]
+ },
+ "stompy":{
+ "file":"/images/tiles/monsters/stompy3.png",
+ "rows":1,"columns":1,"matrix":[["stompy"]]
+ },
+ "minotaur":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_minotaur.png",
+ "rows":1,"columns":1,"matrix":[["minotaur"]]
+ },
+ "phoenix":{
+ "file":"/images/tiles/monsters/monster_phoenix.png",
+ "rows":1,"columns":1,"matrix":[["phoenix"]]
+ },
+ "raptor1":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_raptor1.png",
+ "rows":1,"columns":1,"matrix":[["greenlizard"]]
+ },
+ "raptor2":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_raptor2.png",
+ "rows":1,"columns":1,"matrix":[["redlizard"]]
+ },
+ "grinch":{
+ "file":"/images/tiles/monsters/grinch.png",
+ "rows":1,"columns":1,"matrix":[["grinch"]]
+ },
+ "treant":{
+ "skip":1,
+ "file":"/images/tiles/monsters/monster_treant.png",
+ "rows":1,"columns":1,"matrix":[["treant"]]
+ },
+ "wolf1":{
+ "file":"/images/tiles/monsters/monster_wolf1.png",
+ "rows":1,"columns":1,"matrix":[["wolf"]]
+ },
+ "wolf2":{
+ "file":"/images/tiles/monsters/monster_wolf2.png",
+ "rows":1,"columns":1,"matrix":[["wolfie"]]
+ },
+ "json":{
+ "file":"/images/tiles/monsters/json.png",
+ "rows":1,"columns":1,"matrix":[["json"]]
+ },
+ "mcustom1":{
+ "file":"/images/tiles/monsters/custom1.png?v=6",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["cgoo","crabx","bbpompom","gscorpion"],
+ ["osnake","mole","xscorpion","arcticbee"],
+ ]
+ },
+ "mcustom2":{
+ "file":"/images/tiles/monsters/custom2.png?v=5",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["pinkgooi","pinkgoo",None,None],
+ ["goldenbat","wabbit",None,"stoneworm"],
+ ]
+ },
+ "goos":{
+ "file":"/images/tiles/monsters/goos.png",
+ "rows":2,
+ "columns":5,
+ "matrix":[
+ ["goo0","goo1","goo2","goo3","goo4"],
+ ["goo5","goo6","goo7","goo8","gooD"]
+ ]
+ },
+ "monsters1":{
+ "file":"/images/tiles/monsters/monster1.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["goo","rat","spider","scorpion"],
+ ["bloodworm","snake","bee","bat"]
+ ]
+ },
+ "animals1":{
+ "file":"/images/tiles/monsters/animals1.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["puppy1","puppy2","puppy3","puppy4"],
+ ["kitty1","kitty2","kitty3","kitty4"],
+ ]
+ },
+ "animals2":{
+ "file":"/images/tiles/monsters/animals2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,None],
+ ["porcupine",None,None,None],
+ ]
+ },
+ "birds1":{
+ "file":"/images/tiles/monsters/birds1_modded.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["hen","rooster",None,None],
+ [None,None,None,None],
+ ]
+ },
+ "goblinos":{
+ "file":"/images/tiles/monsters/goblinos.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,"gredpro","ggreenpro"],
+ [None,None,"gpurplepro","gbluepro"],
+ ]
+ },
+ "gking":{
+ "file":"/images/tiles/monsters/goblinkingb.png",
+ "rows":1,"columns":1,"matrix":[["gking"]]
+ },
+ "monsterc6":{
+ "file":"/images/tiles/monsters/monsterc6.png?v=2",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["prat","pppompom","spompom","mighty"],
+ ["slither","deadgob","pinkgoblin","red"]
+ ]
+ },
+ "tinyfairies":{
+ "file":"/images/tiles/monsters/tinyfairies.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["tinyp",None,None,None],
+ [None,None,None,None]
+ ]
+ },
+ "monsterc2":{
+ "file":"/images/tiles/monsters/monsterc2.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,"ent",None,None],
+ [None,None,None,None],
+ ]
+ },
+ "robots":{
+ "file":"/images/tiles/monsters/robots.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,"zapper0",None],
+ [None,None,None,"fieldgen0"],
+ ]
+ },
+ "mage":{
+ "file":"/images/tiles/monsters/mage.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["xmagefz","xmagefi","xmagen","xmagex"],
+ [None,None,None,None],
+ ]
+ },
+ "monsters2":{
+ "file":"/images/tiles/monsters/monster2.png?v=3",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["crab","tortoise","squig","croc"],
+ ["frog","squigtoad","poisio","armadillo"]
+ ]
+ },
+ "monsters3":{
+ "file":"/images/tiles/monsters/monster3c.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["minimush","midimush","plantoid","uglyplant"],
+ ["iceroamer","fireroamer","chestm","chestx"] #"trapchest1","trapchest2"
+ ]
+ },
+ "monsters4":{
+ "file":"/images/tiles/monsters/monster4.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["ghost",None,None,"skeletor"],
+ [None,None,None,None],
+ ]
+ },
+ "vampires":{
+ "file":"/images/tiles/monsters/vampire2d.png",
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ ["mvampire","fvampire",None,None],
+ [None,None,"vbat",None],
+ ]
+ },
+ "mrpumpkin":{
+ "file":"/images/tiles/monsters/mr_pumpkin.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["mrpumpkin"],
+ ]
+ },
+ "cbee":{
+ "file":"/images/tiles/monsters/cbee.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["cutebee"],
+ ]
+ },
+ "icegolem":{
+ "file":"/images/tiles/monsters/iceGolem.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["icegolem"],
+ ]
+ },
+ "mrgreen":{
+ "file":"/images/tiles/monsters/green.png",
+ "rows":1,
+ "columns":1,
+ "matrix":[
+ ["mrgreen"],
+ ]
+ },
+ "emblems":{
+ "file":"/images/sprites/emblems/emblems.png?v=6",
+ "type":"emblem",
+ "rows":2,
+ "columns":10,
+ "matrix":[
+ ["c1","c2","c3","c4","b1","r1","rr1","dp1",None,None],
+ ["m1","m2","m3","m4","b2","br1","o1","j1",None,None],
+ ]
+ },
+
+}
+bodysets=[
+ #skin
+ ["sskin1","skin","small",8,"/images/cosmetics/skins/sskin1.png"],
+ ["mskin1","skin","normal",8,"/images/cosmetics/skins/mskin1.png"],
+ ["lskin1","skin","large",4,"/images/cosmetics/skins/lskin1.png"],
+ #body
+ ["sbody1","body","small",5,"/images/cosmetics/armors/sbody1.png?v=4"],
+ ["mbody1","body","normal",8,"/images/cosmetics/armors/mbody1.png?v=2"],
+ ["mbody2","body","normal",8,"/images/cosmetics/armors/mbody2.png?v=6"],
+ ["mbody3","body","normal",8,"/images/cosmetics/armors/mbody3.png?v=3"],
+ ["mbody4","body","normal",8,"/images/cosmetics/armors/mbody4.png?v=3"],
+ ["mbody5","body","normal",8,"/images/cosmetics/armors/mbody5.png?v=3"],
+ ["mbody6","body","normal",3,"/images/cosmetics/armors/mbody6.png"],
+ #armor
+ ["sarmor1","armor","small",8,"/images/cosmetics/armors/sarmor1.png?v=2"],
+ ["sarmor2","armor","small",4,"/images/cosmetics/armors/sarmor2.png?v=2"],
+ ["marmor1","armor","normal",8,"/images/cosmetics/armors/marmor1.png?v=2"],
+ ["marmor2","armor","normal",8,"/images/cosmetics/armors/marmor2.png?v=3"],
+ ["marmor3","armor","normal",8,"/images/cosmetics/armors/marmor3.png?v=2"],
+ ["marmor4","armor","normal",8,"/images/cosmetics/armors/marmor4.png?v=4"],
+ ["marmor5","armor","normal",8,"/images/cosmetics/armors/marmor5.png?v=4"],
+ ["marmor6","armor","normal",8,"/images/cosmetics/armors/marmor6.png?v=3"],
+ ["marmor7","armor","normal",8,"/images/cosmetics/armors/marmor7.png?v=2"],
+ ["marmor8","armor","normal",8,"/images/cosmetics/armors/marmor8.png?v=2"],
+ ["marmor9","armor","normal",8,"/images/cosmetics/armors/marmor9.png?v=2"],
+ ["marmor10","armor","normal",8,"/images/cosmetics/armors/marmor10.png"],
+ ["marmor11","armor","normal",8,"/images/cosmetics/armors/marmor11.png"],
+ ["marmor12","armor","normal",6,"/images/cosmetics/armors/marmor12.png"],
+ ["larmor1","armor","large",2,"/images/cosmetics/armors/larmor1.png"],
+ #character
+ ["lchar1","character","large",8,"/images/all_characters/lchar1.png"],
+ ["mchar16","character","normal",8,"/images/all_characters/mchar16.png"],
+ ["schar7","character","small",8,"/images/all_characters/schar7.png"],
+ ["xschar2","character","xsmall",8,"/images/all_characters/xschar2.png"],
+ ["xxschar2","character","xxsmall",8,"/images/all_characters/xxschar2.png"],
+]
+
+for s in bodysets:
+ sprites[s[0]]={
+ "file":s[4],
+ "type":s[1],
+ "size":s[2],
+ "rows":2,
+ "columns":4,
+ "matrix":[
+ [None,None,None,None],
+ [None,None,None,None],
+ ]
+ }
+ last=0
+ nmap={0:"a",1:"b",2:"c",3:"d",4:"e",5:"f",6:"g",7:"h"}
+ for i in xrange(2):
+ for j in xrange(4):
+ if last
+show_json(data);
+
+
+
+ 1. Make sure there are no external links inside the Code
+ 2. Make sure the Code is simple, understandable
+ 3. Make sure the Code doesn't have anything funky
+ 4. If you are not sure, ask someone you trust to make sure
+
+
+
+ Returns: +
Example usages:
+ +Promise Reference:
+ +"resolve" ++ Arguments: +
+ Returns: +
List of available key names: show_json(Object.keys(G.items))
+ +Example usages:
+ +Promise Reference:
+ +"resolve" ++ Arguments: +
+ Returns: +
Example usages:
+ +Promise Reference:
+ +"resolve" ++ Arguments: +
+ Returns: +
Example usages:
+ +Promise Reference:
+ +"resolve" +Work in progress, returned Promise's aren't resolved yet!
\ No newline at end of file diff --git a/docs/guide/basics.html b/docs/guide/basics.html new file mode 100644 index 0000000..c8d04fa --- /dev/null +++ b/docs/guide/basics.html @@ -0,0 +1,65 @@ +> Right click to equip and un-equip items. You can drag items within your inventory. When a merchant NPC is active, right click the item to see the item value and sell the item.
+ + +> Left click to target monsters and players. Press the character name between HP and MP bars to target yourself. You can see the properties/items of the targeted entity. You can only target one entity at a time.
+> The Bank is for storing items and gold. The Bank is shared across all your characters!
+The Crypt [Dungeon]
+ ++
Note: Instances are only alive as long as there's someone inside and online!
+ +Lair of the Dark Mage [Dungeon]
+ ++
+ First phase has a random Freeze Burst every 6 seconds that freezes the opponent for 12 seconds! G.monsters.xmagefz +
+ ++ Second stage has Anger / random targeting and the Multi Burn skill that hurls a burning fireball to everyone! G.monsters.xmagefi +
+ ++ Third stage has Tangle, Reflection and Self Healing. G.monsters.xmagen +
+ ++ The last stage has 12,640 damage, Immunity, Anger and Warp/Stomp! G.monsters.xmagex +
+ +Note: Instances are only alive as long as there's someone inside and online!
+ +A/B Testing PVP Event
+ ++ In A/B Testing players are divided into 2 groups to fight. Winning team gets better rewards! +
+ ++ character.team is either "A" or "B" for all participants. The PVP is safe. Unlike other events, at the end of the event, each character is placed back to where they were taken from. In the event of a character reload, you're placed in Mainland. You can only signup in the first 2 minutes, yet you can rejoin to the same team later on if you end up disconnecting. +
+ ++ 1000 kills get you the G.achievements.abtesting achievement and the G.titles.abtesting title on your orb! You can see the winner drops at: G.drops.abtesting and loser drops at: G.drops.abtesting_loser +
+ + + + + + + + + +Snippets
+ +Giga Crab Beach Event
+ ++ Giga Crab is a challenging server event boss. As long as there are Huge Crabs around, Giga Crab only receives one damage! The entire server needs to get together to continually clear all the Huge Crabs that spawn. The event lasts 40 minutes but as long as Giga Crab is being engaged, the event goes on! +
+ ++ Giga Crab's ID is "crabxx" - It spawns regular Huge Crab's "crabx" +
+ + + + + + + + +Snippets
+ +Egg Hunt on Adventure Land
+ ++
+ Collect 4 pieces of the Bunny attire to complete the set and unlock the set bonuses! +
+ Wabbit spawns hourly on a random map and inside a random monster pack. It's super hard to kill for 5 minutes, which should give you enough time to join the fight! +
+ The crafting NPC is near the Goo's in Mainland. +
+ +Snippets
+ +Franky Event
+ ++ Franky is a challenging server event boss. He spawns Nerfed Mummy's that are very hard to defeat. A good way to die. The event lasts 40 minutes but as long as Franky is attacked in the last 20 seconds, the event will go on. +
+ + + + + + + + +Snippets
+ +Goo Brawl Event
+ ++ Goo Brawl features a Zen island where you can smash funky cooperative Goo's in peace and Goo's have a chance to drop Fun Token's! +
+ ++ A very rare Rainbow Goo occasionally spawns too! Has different drops and achievements! +
+ + + + + + + + + + +Snippets
+ +Halloween on Adventure Land
+ ++
+ Participate in the co-op bossfights for the drops and the Halloween buff. +
++ Try to catch and defeat the junior bosses whenever they spawn and be careful about the elusive Slenderman! +
+ ++ There are so so many items special for Halloween that are hard to get any other time! +
Holiday Season on Adventure Land
+ ++
+
+
+ The Holiday Spirit set includes many items, some you can craft, most you get by returning the global drops to the NPC's. +
+ The snowman spawns every hour. Snowman is a collaborative boss, everyone who participates gets a reward. You can only deal 1 damage to Snowman - better participate at each spawn for the common good! +
+ +
+ Grinch is a trickster. He portals to you, steals your gold, and escapes before he can be defeated! Make sure you are never alone. Defeating Grinch requires a lot of planning, as he doesn't stay long in one place and can heal himself. When he spawns, he already has 12,000,000+ gold in his pockets!
+
+
+ Dealing 400,000 damage to Grinch unlocks the Festive achievement and a title reward for your equipped cape, so make sure you target him whenever he teleports to you!
+
+ Tip: Grinch really hates the sweater! +
+ ++ We also have many new items for the winter and holiday season, like throwable Snowballs! +
Snippets
+ +Ice Golem Event
+ ++ Ice Golem hurls frostballs to everyone who dares engage him. Hard to bring down but not impossible! +
+ + + + + + + + +Snippets
+ +Lunar New Year on Adventure Land
+ ++
+ Dragold spanws every 3 hours. Take a chance to capture one of the very rare drops. A unique crown as a cosmetics item and Dragold's chrysalis! (to have a Dragold as a pet!) +
+ ++ The Legendary Tiger appears to players and drops Tiger set items each time you manage to land a hit! Make sure to not hurt this peaceful and giving animal! +
+ + + + + + +Valentines Day Event on Adventure Land
+ ++
+ Love Goo spawns every hour in a random map and inside a random monster pack. Love Goo is co-op but has 98% avoidance, so it's a bit tricky to land a hit! :) +
+ +Snippet
+ +Fishing zone nearby!
+ +
Craft a Fishing Rod and your merchant can fish here.
\ No newline at end of file diff --git a/docs/guide/skill-mining.html b/docs/guide/skill-mining.html new file mode 100644 index 0000000..be533ba --- /dev/null +++ b/docs/guide/skill-mining.html @@ -0,0 +1,3 @@ +Mining zone nearby!
+ +
Craft a Pickaxe and your merchant can mine here.
\ No newline at end of file diff --git a/docs/guide/stats.html b/docs/guide/stats.html new file mode 100644 index 0000000..b93075c --- /dev/null +++ b/docs/guide/stats.html @@ -0,0 +1,48 @@ +Get your tracktrix by completing 4 Monster Hunt Quest's from the NPC Daisy on Mainland, you can get the Tracktrix in exchange for 4 Monster Token's.
+ +
+ +1.0 For each monster your character or your party kills
+ +0.3 Per each one of your characters in your party or within 600px of you
+ -0.3 If you are not within 600px of the kill and your last kill was a different monster
+ -0.1 If an allied merchant is within 600px of the kill
+
+ Co-op monster scores and kills aren't shared within a party
+ All score modifications are halved for co-op monsters
+
+ Merchants in a party only get half the points
+ If you've contributed more than 2% in Co-Op fights, you can't lose points from distance
+
Hello World
\ No newline at end of file diff --git a/docs/tutorial/bank.html b/docs/tutorial/bank.html new file mode 100644 index 0000000..6a24c5a --- /dev/null +++ b/docs/tutorial/bank.html @@ -0,0 +1,15 @@ +The bank houses item and gold storage clerks. It's shared across your characters, provides an easy way to store/transfer items and gold. Only one of your characters can enter the bank at one time.
+ +{% for task in tutorial_data("bank").tasks %} + {% if loop.first %}{% endif %} +o {{task_name(task)}}
+ {% if task == "bank" %} +The bank is to the right of the town square. Move There
+ {% elif task == "store" %} +Store an item with one of the clerks. Two of the clerks are unlocked. You need to unlock the others with gold or shells.
+ {% elif task == "deposit" %} +Deposit gold to Mr. Rich at the end of the hallway.
+ {% endif %} + + {% if not loop.last %}{% endif %} +{% endfor %} \ No newline at end of file diff --git a/docs/tutorial/compound.html b/docs/tutorial/compound.html new file mode 100644 index 0000000..11e30df --- /dev/null +++ b/docs/tutorial/compound.html @@ -0,0 +1,28 @@ +For accessories there's an entirely different system. You can compound 3 accessories of the same level to make a higher level, stronger version. Whenever you gather 3 accessories of the same kind that you don't equip, combine them to make a stronger accessory and free up inventory space!
+ +You'll just need gold to buy the gear and scrolls, so leave your character with Code open so your character farms gold.
+ +{% for task in tutorial_data("compound").tasks %} + {% if loop.first %}{% endif %} +o {{task_name(task)}}
+ {% if task == "buycscroll0" %} +Compound Scroll's are 6,400 gold each. Travel to the NPC
+=>
+ {% elif task == "compound" %} +Visit Cue in town with 3 accessories of the same kind and a Compound Scroll.
+=> + + + =>
+ {% endif %} + + {% if not loop.last %}{% endif %} +{% endfor %} + + \ No newline at end of file diff --git a/docs/tutorial/hellocode.html b/docs/tutorial/hellocode.html new file mode 100644 index 0000000..7746bea --- /dev/null +++ b/docs/tutorial/hellocode.html @@ -0,0 +1,29 @@ +JavaScript is a very very practical language. You don't have to know much about it to use it. It's a scripting language, meaning that you can also run things dynamically.
+ +{% for task in tutorial_data("hellocode").tasks %} + {% if loop.first %}{% endif %} +o {{task_name(task)}}
+ {% if task == "engage" %} + Just open the Code, and click Engage! at the bottom right corner. Without any modifications to the default code. You won't even feel it's working, it will just use potions if you are down. + + + + Hint: If your keyboard is English, the |\ key is a shortcut to quickly engage/disengage code. + {% elif task == "x" %} + Javascript is very flexible, so you can run snippets any time. If your code is already running, they are executed in the same environment. So you can dynamically affect things within your running Code too! + + For this exercise tho, we are doing something simple, just a basic code to make your character move up. + +In this step, you are going to discover the various game interfaces! To complete each step, close the tutorial and open that interface once. Keep in mind that ESC/Escape key closes anything.
+ +{% for task in tutorial_data("interface").tasks %} + {% if loop.first %}{% endif %} +o {{task_name(task)}}
+ {% if task == "character" %} + You can press your character name on the bottom center of the screen to focus your character. + + + {% elif task == "inventory" %} + To open your inventory, press the indicator that shows your inventory status. It's in the bottom center of the screen too. + +For this step, you need to be at the starting/spawn area. Move There
+ +{% for task in tutorial_data("learntofight").tasks %} + {% if loop.first %}{% endif %} +o {{task_name(task)}}
+ {% if task == "killagoo" %} +Defeat your first Goo. Left click to target the Goo. Right click to attack.
+ {% elif task == "firstloot" %} +Loot the chest by simply clicking on it!
+ {% endif %} + + {% if not loop.last %}{% endif %} +{% endfor %} + + \ No newline at end of file diff --git a/docs/tutorial/move.html b/docs/tutorial/move.html new file mode 100644 index 0000000..7d7f832 --- /dev/null +++ b/docs/tutorial/move.html @@ -0,0 +1 @@ +It's time to move
\ No newline at end of file diff --git a/docs/tutorial/theend.html b/docs/tutorial/theend.html new file mode 100644 index 0000000..4b4374c --- /dev/null +++ b/docs/tutorial/theend.html @@ -0,0 +1,5 @@ + +This is the end of our short tutorial for now, as you've no doubt noticed, it's a work in progress. + +When new steps are added, they will be available for you even though you've completed what's available right now! + \ No newline at end of file diff --git a/docs/tutorial/upgrade.html b/docs/tutorial/upgrade.html new file mode 100644 index 0000000..f72ddd7 --- /dev/null +++ b/docs/tutorial/upgrade.html @@ -0,0 +1,40 @@ +You can upgrade weapons and armor with upgrade scrolls, after each level the items become stronger, yet the chances become lower and lower. If the upgrade fails, the item is lost!
+ +When you are first starting, the most effective item is your weapon, so start by getting your weapon to +7. Then buy NPC gear and get each of them to +7 too. Travel to the NPCs
+ + +You'll just need gold to buy the gear and scrolls, so leave your character with Code open so your character farms gold.
+ +{% for task in tutorial_data("upgrade").tasks %} + {% if loop.first %}{% endif %} +o {{task_name(task)}}
+ {% if task == "buyscrolls" %} +First you need to buy scrolls from the NPC in Town. Basic scrolls are 1,000 gold each.
+ + {% elif task == "upgrade" %} +Visit Cue in town to upgrade a weapon from +0 to +1. After +7, you'll need to use more expensive High Upgrade Scroll's.
++ =>
+Use one of these scrolls to add stats to your upgraded armor. Your main stats increase your damage and attributes.
++ =>
+ {% endif %} + + {% if not loop.last %}{% endif %} +{% endfor %} + + \ No newline at end of file diff --git a/electron/.DS_Store b/electron/.DS_Store new file mode 100644 index 0000000..2dd2afb Binary files /dev/null and b/electron/.DS_Store differ diff --git a/electron/files/.DS_Store b/electron/files/.DS_Store new file mode 100644 index 0000000..2f9fd4d Binary files /dev/null and b/electron/files/.DS_Store differ diff --git a/electron/files/images/all_characters/lchar1.png b/electron/files/images/all_characters/lchar1.png new file mode 100644 index 0000000..2d99c87 Binary files /dev/null and b/electron/files/images/all_characters/lchar1.png differ diff --git a/electron/files/images/all_characters/mchar16.png b/electron/files/images/all_characters/mchar16.png new file mode 100644 index 0000000..e34bc20 Binary files /dev/null and b/electron/files/images/all_characters/mchar16.png differ diff --git a/electron/files/images/all_characters/schar7.png b/electron/files/images/all_characters/schar7.png new file mode 100644 index 0000000..f0d8e7b Binary files /dev/null and b/electron/files/images/all_characters/schar7.png differ diff --git a/electron/files/images/all_characters/xschar2.png b/electron/files/images/all_characters/xschar2.png new file mode 100644 index 0000000..d7ec95f Binary files /dev/null and b/electron/files/images/all_characters/xschar2.png differ diff --git a/electron/files/images/all_characters/xxschar2.png b/electron/files/images/all_characters/xxschar2.png new file mode 100644 index 0000000..876f311 Binary files /dev/null and b/electron/files/images/all_characters/xxschar2.png differ diff --git a/electron/files/images/cosmetics/accessories/eyeglasses.png b/electron/files/images/cosmetics/accessories/eyeglasses.png new file mode 100644 index 0000000..f2cc59a Binary files /dev/null and b/electron/files/images/cosmetics/accessories/eyeglasses.png differ diff --git a/electron/files/images/cosmetics/accessories/kglasses.png b/electron/files/images/cosmetics/accessories/kglasses.png new file mode 100644 index 0000000..e3058ce Binary files /dev/null and b/electron/files/images/cosmetics/accessories/kglasses.png differ diff --git a/electron/files/images/cosmetics/armors/larmor1.png b/electron/files/images/cosmetics/armors/larmor1.png new file mode 100644 index 0000000..390ec45 Binary files /dev/null and b/electron/files/images/cosmetics/armors/larmor1.png differ diff --git a/electron/files/images/cosmetics/armors/mabw.png b/electron/files/images/cosmetics/armors/mabw.png new file mode 100644 index 0000000..b9ecbc6 Binary files /dev/null and b/electron/files/images/cosmetics/armors/mabw.png differ diff --git a/electron/files/images/cosmetics/armors/marmor1.png b/electron/files/images/cosmetics/armors/marmor1.png new file mode 100644 index 0000000..814bba6 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor1.png differ diff --git a/electron/files/images/cosmetics/armors/marmor10.png b/electron/files/images/cosmetics/armors/marmor10.png new file mode 100644 index 0000000..dcc5f98 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor10.png differ diff --git a/electron/files/images/cosmetics/armors/marmor11.png b/electron/files/images/cosmetics/armors/marmor11.png new file mode 100644 index 0000000..1ad60b4 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor11.png differ diff --git a/electron/files/images/cosmetics/armors/marmor12.png b/electron/files/images/cosmetics/armors/marmor12.png new file mode 100644 index 0000000..abc913f Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor12.png differ diff --git a/electron/files/images/cosmetics/armors/marmor2.png b/electron/files/images/cosmetics/armors/marmor2.png new file mode 100644 index 0000000..ed5e5f2 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor2.png differ diff --git a/electron/files/images/cosmetics/armors/marmor3.png b/electron/files/images/cosmetics/armors/marmor3.png new file mode 100644 index 0000000..c46fc82 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor3.png differ diff --git a/electron/files/images/cosmetics/armors/marmor4.png b/electron/files/images/cosmetics/armors/marmor4.png new file mode 100644 index 0000000..d57c4c3 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor4.png differ diff --git a/electron/files/images/cosmetics/armors/marmor5.png b/electron/files/images/cosmetics/armors/marmor5.png new file mode 100644 index 0000000..415d03d Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor5.png differ diff --git a/electron/files/images/cosmetics/armors/marmor6.png b/electron/files/images/cosmetics/armors/marmor6.png new file mode 100644 index 0000000..93da99c Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor6.png differ diff --git a/electron/files/images/cosmetics/armors/marmor7.png b/electron/files/images/cosmetics/armors/marmor7.png new file mode 100644 index 0000000..c9708c8 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor7.png differ diff --git a/electron/files/images/cosmetics/armors/marmor8.png b/electron/files/images/cosmetics/armors/marmor8.png new file mode 100644 index 0000000..89a5df1 Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor8.png differ diff --git a/electron/files/images/cosmetics/armors/marmor9.png b/electron/files/images/cosmetics/armors/marmor9.png new file mode 100644 index 0000000..2a58a4d Binary files /dev/null and b/electron/files/images/cosmetics/armors/marmor9.png differ diff --git a/electron/files/images/cosmetics/armors/mbody1.png b/electron/files/images/cosmetics/armors/mbody1.png new file mode 100644 index 0000000..2f329ae Binary files /dev/null and b/electron/files/images/cosmetics/armors/mbody1.png differ diff --git a/electron/files/images/cosmetics/armors/mbody2.png b/electron/files/images/cosmetics/armors/mbody2.png new file mode 100644 index 0000000..e76c95a Binary files /dev/null and b/electron/files/images/cosmetics/armors/mbody2.png differ diff --git a/electron/files/images/cosmetics/armors/mbody3.png b/electron/files/images/cosmetics/armors/mbody3.png new file mode 100644 index 0000000..54ff8cc Binary files /dev/null and b/electron/files/images/cosmetics/armors/mbody3.png differ diff --git a/electron/files/images/cosmetics/armors/mbody4.png b/electron/files/images/cosmetics/armors/mbody4.png new file mode 100644 index 0000000..1fa6728 Binary files /dev/null and b/electron/files/images/cosmetics/armors/mbody4.png differ diff --git a/electron/files/images/cosmetics/armors/mbody5.png b/electron/files/images/cosmetics/armors/mbody5.png new file mode 100644 index 0000000..9734ec6 Binary files /dev/null and b/electron/files/images/cosmetics/armors/mbody5.png differ diff --git a/electron/files/images/cosmetics/armors/mbody6.png b/electron/files/images/cosmetics/armors/mbody6.png new file mode 100644 index 0000000..84c707e Binary files /dev/null and b/electron/files/images/cosmetics/armors/mbody6.png differ diff --git a/electron/files/images/cosmetics/armors/sarmor1.png b/electron/files/images/cosmetics/armors/sarmor1.png new file mode 100644 index 0000000..2c24220 Binary files /dev/null and b/electron/files/images/cosmetics/armors/sarmor1.png differ diff --git a/electron/files/images/cosmetics/armors/sarmor2.png b/electron/files/images/cosmetics/armors/sarmor2.png new file mode 100644 index 0000000..a50f5de Binary files /dev/null and b/electron/files/images/cosmetics/armors/sarmor2.png differ diff --git a/electron/files/images/cosmetics/armors/sbody1.png b/electron/files/images/cosmetics/armors/sbody1.png new file mode 100644 index 0000000..308516d Binary files /dev/null and b/electron/files/images/cosmetics/armors/sbody1.png differ diff --git a/electron/files/images/cosmetics/beardo/beard1.png b/electron/files/images/cosmetics/beardo/beard1.png new file mode 100644 index 0000000..e72250b Binary files /dev/null and b/electron/files/images/cosmetics/beardo/beard1.png differ diff --git a/electron/files/images/cosmetics/beardo/burningeyes1_anim.png b/electron/files/images/cosmetics/beardo/burningeyes1_anim.png new file mode 100644 index 0000000..0aa5495 Binary files /dev/null and b/electron/files/images/cosmetics/beardo/burningeyes1_anim.png differ diff --git a/electron/files/images/cosmetics/beardo/burningeyes2_anim.png b/electron/files/images/cosmetics/beardo/burningeyes2_anim.png new file mode 100644 index 0000000..b7c879b Binary files /dev/null and b/electron/files/images/cosmetics/beardo/burningeyes2_anim.png differ diff --git a/electron/files/images/cosmetics/beardo/facemakeup.png b/electron/files/images/cosmetics/beardo/facemakeup.png new file mode 100644 index 0000000..c0de43b Binary files /dev/null and b/electron/files/images/cosmetics/beardo/facemakeup.png differ diff --git a/electron/files/images/cosmetics/beardo/mask1.png b/electron/files/images/cosmetics/beardo/mask1.png new file mode 100644 index 0000000..bde0a64 Binary files /dev/null and b/electron/files/images/cosmetics/beardo/mask1.png differ diff --git a/electron/files/images/cosmetics/gravestones/gravestone.png b/electron/files/images/cosmetics/gravestones/gravestone.png new file mode 100644 index 0000000..a9ae841 Binary files /dev/null and b/electron/files/images/cosmetics/gravestones/gravestone.png differ diff --git a/electron/files/images/cosmetics/hairdo/bwhair.png b/electron/files/images/cosmetics/hairdo/bwhair.png new file mode 100644 index 0000000..d3fb039 Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/bwhair.png differ diff --git a/electron/files/images/cosmetics/hairdo/hairdo1.png b/electron/files/images/cosmetics/hairdo/hairdo1.png new file mode 100644 index 0000000..71abb8f Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/hairdo1.png differ diff --git a/electron/files/images/cosmetics/hairdo/hairdo2.png b/electron/files/images/cosmetics/hairdo/hairdo2.png new file mode 100644 index 0000000..cff3eca Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/hairdo2.png differ diff --git a/electron/files/images/cosmetics/hairdo/hairdo3.png b/electron/files/images/cosmetics/hairdo/hairdo3.png new file mode 100644 index 0000000..044ec5e Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/hairdo3.png differ diff --git a/electron/files/images/cosmetics/hairdo/hairdo4.png b/electron/files/images/cosmetics/hairdo/hairdo4.png new file mode 100644 index 0000000..862c388 Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/hairdo4.png differ diff --git a/electron/files/images/cosmetics/hairdo/hairdo5.png b/electron/files/images/cosmetics/hairdo/hairdo5.png new file mode 100644 index 0000000..8ebce54 Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/hairdo5.png differ diff --git a/electron/files/images/cosmetics/hairdo/hairdo6.png b/electron/files/images/cosmetics/hairdo/hairdo6.png new file mode 100644 index 0000000..d72cb18 Binary files /dev/null and b/electron/files/images/cosmetics/hairdo/hairdo6.png differ diff --git a/electron/files/images/cosmetics/hats/bathat_anim.png b/electron/files/images/cosmetics/hats/bathat_anim.png new file mode 100644 index 0000000..2df5809 Binary files /dev/null and b/electron/files/images/cosmetics/hats/bathat_anim.png differ diff --git a/electron/files/images/cosmetics/hats/gcandle_anim.png b/electron/files/images/cosmetics/hats/gcandle_anim.png new file mode 100644 index 0000000..64fa371 Binary files /dev/null and b/electron/files/images/cosmetics/hats/gcandle_anim.png differ diff --git a/electron/files/images/cosmetics/hats/halo_anim.png b/electron/files/images/cosmetics/hats/halo_anim.png new file mode 100644 index 0000000..1f9c269 Binary files /dev/null and b/electron/files/images/cosmetics/hats/halo_anim.png differ diff --git a/electron/files/images/cosmetics/hats/hats1.png b/electron/files/images/cosmetics/hats/hats1.png new file mode 100644 index 0000000..1744d06 Binary files /dev/null and b/electron/files/images/cosmetics/hats/hats1.png differ diff --git a/electron/files/images/cosmetics/hats/hats2.png b/electron/files/images/cosmetics/hats/hats2.png new file mode 100644 index 0000000..24b1b93 Binary files /dev/null and b/electron/files/images/cosmetics/hats/hats2.png differ diff --git a/electron/files/images/cosmetics/hats/hats3.png b/electron/files/images/cosmetics/hats/hats3.png new file mode 100644 index 0000000..73ecb01 Binary files /dev/null and b/electron/files/images/cosmetics/hats/hats3.png differ diff --git a/electron/files/images/cosmetics/hats/hats4.png b/electron/files/images/cosmetics/hats/hats4.png new file mode 100644 index 0000000..2ff659e Binary files /dev/null and b/electron/files/images/cosmetics/hats/hats4.png differ diff --git a/electron/files/images/cosmetics/makeup/femalemakeupv2.png b/electron/files/images/cosmetics/makeup/femalemakeupv2.png new file mode 100644 index 0000000..d41076d Binary files /dev/null and b/electron/files/images/cosmetics/makeup/femalemakeupv2.png differ diff --git a/electron/files/images/cosmetics/makeup/kunique.png b/electron/files/images/cosmetics/makeup/kunique.png new file mode 100644 index 0000000..010eae1 Binary files /dev/null and b/electron/files/images/cosmetics/makeup/kunique.png differ diff --git a/electron/files/images/cosmetics/makeup/makeup1.png b/electron/files/images/cosmetics/makeup/makeup1.png new file mode 100644 index 0000000..529221d Binary files /dev/null and b/electron/files/images/cosmetics/makeup/makeup1.png differ diff --git a/electron/files/images/cosmetics/makeup/malemakeup.png b/electron/files/images/cosmetics/makeup/malemakeup.png new file mode 100644 index 0000000..9f8b09c Binary files /dev/null and b/electron/files/images/cosmetics/makeup/malemakeup.png differ diff --git a/electron/files/images/cosmetics/makeup/smakeup.png b/electron/files/images/cosmetics/makeup/smakeup.png new file mode 100644 index 0000000..dea5b66 Binary files /dev/null and b/electron/files/images/cosmetics/makeup/smakeup.png differ diff --git a/electron/files/images/cosmetics/skins/lskin1.png b/electron/files/images/cosmetics/skins/lskin1.png new file mode 100644 index 0000000..8e31a59 Binary files /dev/null and b/electron/files/images/cosmetics/skins/lskin1.png differ diff --git a/electron/files/images/cosmetics/skins/mbw.png b/electron/files/images/cosmetics/skins/mbw.png new file mode 100644 index 0000000..2dde702 Binary files /dev/null and b/electron/files/images/cosmetics/skins/mbw.png differ diff --git a/electron/files/images/cosmetics/skins/mskin1.png b/electron/files/images/cosmetics/skins/mskin1.png new file mode 100644 index 0000000..9bbb1bb Binary files /dev/null and b/electron/files/images/cosmetics/skins/mskin1.png differ diff --git a/electron/files/images/cosmetics/skins/sskin1.png b/electron/files/images/cosmetics/skins/sskin1.png new file mode 100644 index 0000000..0429a10 Binary files /dev/null and b/electron/files/images/cosmetics/skins/sskin1.png differ diff --git a/electron/files/images/cosmetics/tails/wolftail.png b/electron/files/images/cosmetics/tails/wolftail.png new file mode 100644 index 0000000..72acb96 Binary files /dev/null and b/electron/files/images/cosmetics/tails/wolftail.png differ diff --git a/electron/files/images/cosmetics/tails/wolftail2.png b/electron/files/images/cosmetics/tails/wolftail2.png new file mode 100644 index 0000000..9e47aa8 Binary files /dev/null and b/electron/files/images/cosmetics/tails/wolftail2.png differ diff --git a/electron/files/images/cosmetics/tails/wolftail3.png b/electron/files/images/cosmetics/tails/wolftail3.png new file mode 100644 index 0000000..7d2c483 Binary files /dev/null and b/electron/files/images/cosmetics/tails/wolftail3.png differ diff --git a/electron/files/images/cosmetics/wings/backpack2.png b/electron/files/images/cosmetics/wings/backpack2.png new file mode 100644 index 0000000..7725f92 Binary files /dev/null and b/electron/files/images/cosmetics/wings/backpack2.png differ diff --git a/electron/files/images/cosmetics/wings/backpacks.png b/electron/files/images/cosmetics/wings/backpacks.png new file mode 100644 index 0000000..7585ce8 Binary files /dev/null and b/electron/files/images/cosmetics/wings/backpacks.png differ diff --git a/electron/files/images/cosmetics/wings/wings1.png b/electron/files/images/cosmetics/wings/wings1.png new file mode 100644 index 0000000..85f8e80 Binary files /dev/null and b/electron/files/images/cosmetics/wings/wings1.png differ diff --git a/electron/files/images/cosmetics/wings/wings2.png b/electron/files/images/cosmetics/wings/wings2.png new file mode 100644 index 0000000..e56275b Binary files /dev/null and b/electron/files/images/cosmetics/wings/wings2.png differ diff --git a/electron/files/images/cosmetics/wings/wings3.png b/electron/files/images/cosmetics/wings/wings3.png new file mode 100644 index 0000000..5aa2fe1 Binary files /dev/null and b/electron/files/images/cosmetics/wings/wings3.png differ diff --git a/electron/files/images/sprites/animations/Block.png b/electron/files/images/sprites/animations/Block.png new file mode 100755 index 0000000..543c66d Binary files /dev/null and b/electron/files/images/sprites/animations/Block.png differ diff --git a/electron/files/images/sprites/animations/BloodSplatter0.png b/electron/files/images/sprites/animations/BloodSplatter0.png new file mode 100755 index 0000000..78f4b80 Binary files /dev/null and b/electron/files/images/sprites/animations/BloodSplatter0.png differ diff --git a/electron/files/images/sprites/animations/BloodSplatter3.png b/electron/files/images/sprites/animations/BloodSplatter3.png new file mode 100755 index 0000000..2b5ad15 Binary files /dev/null and b/electron/files/images/sprites/animations/BloodSplatter3.png differ diff --git a/electron/files/images/sprites/animations/CArrow.png b/electron/files/images/sprites/animations/CArrow.png new file mode 100644 index 0000000..05c2305 Binary files /dev/null and b/electron/files/images/sprites/animations/CArrow.png differ diff --git a/electron/files/images/sprites/animations/CGreen_Spark0.png b/electron/files/images/sprites/animations/CGreen_Spark0.png new file mode 100644 index 0000000..dece80f Binary files /dev/null and b/electron/files/images/sprites/animations/CGreen_Spark0.png differ diff --git a/electron/files/images/sprites/animations/CGreen_Spark3.png b/electron/files/images/sprites/animations/CGreen_Spark3.png new file mode 100644 index 0000000..a8a7e74 Binary files /dev/null and b/electron/files/images/sprites/animations/CGreen_Spark3.png differ diff --git a/electron/files/images/sprites/animations/CPurple_Spark.png b/electron/files/images/sprites/animations/CPurple_Spark.png new file mode 100644 index 0000000..772e5d2 Binary files /dev/null and b/electron/files/images/sprites/animations/CPurple_Spark.png differ diff --git a/electron/files/images/sprites/animations/CRed_Spark0.png b/electron/files/images/sprites/animations/CRed_Spark0.png new file mode 100644 index 0000000..31cac8b Binary files /dev/null and b/electron/files/images/sprites/animations/CRed_Spark0.png differ diff --git a/electron/files/images/sprites/animations/CRed_Spark5.png b/electron/files/images/sprites/animations/CRed_Spark5.png new file mode 100644 index 0000000..7d5a36f Binary files /dev/null and b/electron/files/images/sprites/animations/CRed_Spark5.png differ diff --git a/electron/files/images/sprites/animations/Consume0.png b/electron/files/images/sprites/animations/Consume0.png new file mode 100755 index 0000000..b5b8c3e Binary files /dev/null and b/electron/files/images/sprites/animations/Consume0.png differ diff --git a/electron/files/images/sprites/animations/Consume2.png b/electron/files/images/sprites/animations/Consume2.png new file mode 100755 index 0000000..d27ddd4 Binary files /dev/null and b/electron/files/images/sprites/animations/Consume2.png differ diff --git a/electron/files/images/sprites/animations/ConsumeP.png b/electron/files/images/sprites/animations/ConsumeP.png new file mode 100644 index 0000000..2cee95b Binary files /dev/null and b/electron/files/images/sprites/animations/ConsumeP.png differ diff --git a/electron/files/images/sprites/animations/ConsumeR.png b/electron/files/images/sprites/animations/ConsumeR.png new file mode 100644 index 0000000..0679ed7 Binary files /dev/null and b/electron/files/images/sprites/animations/ConsumeR.png differ diff --git a/electron/files/images/sprites/animations/Dampen.png b/electron/files/images/sprites/animations/Dampen.png new file mode 100644 index 0000000..a6c5046 Binary files /dev/null and b/electron/files/images/sprites/animations/Dampen.png differ diff --git a/electron/files/images/sprites/animations/Electric.png b/electron/files/images/sprites/animations/Electric.png new file mode 100755 index 0000000..18d9dd4 Binary files /dev/null and b/electron/files/images/sprites/animations/Electric.png differ diff --git a/electron/files/images/sprites/animations/ExplodeA.png b/electron/files/images/sprites/animations/ExplodeA.png new file mode 100755 index 0000000..1d25080 Binary files /dev/null and b/electron/files/images/sprites/animations/ExplodeA.png differ diff --git a/electron/files/images/sprites/animations/ExplodeB.png b/electron/files/images/sprites/animations/ExplodeB.png new file mode 100755 index 0000000..1b568d8 Binary files /dev/null and b/electron/files/images/sprites/animations/ExplodeB.png differ diff --git a/electron/files/images/sprites/animations/ExplodeC.png b/electron/files/images/sprites/animations/ExplodeC.png new file mode 100755 index 0000000..86c6dd5 Binary files /dev/null and b/electron/files/images/sprites/animations/ExplodeC.png differ diff --git a/electron/files/images/sprites/animations/ExplodeP2.png b/electron/files/images/sprites/animations/ExplodeP2.png new file mode 100644 index 0000000..3e964e8 Binary files /dev/null and b/electron/files/images/sprites/animations/ExplodeP2.png differ diff --git a/electron/files/images/sprites/animations/ExplodeUCS.png b/electron/files/images/sprites/animations/ExplodeUCS.png new file mode 100644 index 0000000..d22ae8f Binary files /dev/null and b/electron/files/images/sprites/animations/ExplodeUCS.png differ diff --git a/electron/files/images/sprites/animations/GlintF.png b/electron/files/images/sprites/animations/GlintF.png new file mode 100644 index 0000000..aead437 Binary files /dev/null and b/electron/files/images/sprites/animations/GlintF.png differ diff --git a/electron/files/images/sprites/animations/Light.png b/electron/files/images/sprites/animations/Light.png new file mode 100644 index 0000000..4b5c5ce Binary files /dev/null and b/electron/files/images/sprites/animations/Light.png differ diff --git a/electron/files/images/sprites/animations/MBlob.png b/electron/files/images/sprites/animations/MBlob.png new file mode 100644 index 0000000..3a81ee7 Binary files /dev/null and b/electron/files/images/sprites/animations/MBlob.png differ diff --git a/electron/files/images/sprites/animations/MBlobP.png b/electron/files/images/sprites/animations/MBlobP.png new file mode 100644 index 0000000..f8654b3 Binary files /dev/null and b/electron/files/images/sprites/animations/MBlobP.png differ diff --git a/electron/files/images/sprites/animations/MBlobR.png b/electron/files/images/sprites/animations/MBlobR.png new file mode 100644 index 0000000..4843485 Binary files /dev/null and b/electron/files/images/sprites/animations/MBlobR.png differ diff --git a/electron/files/images/sprites/animations/NuclearA1.png b/electron/files/images/sprites/animations/NuclearA1.png new file mode 100755 index 0000000..213caca Binary files /dev/null and b/electron/files/images/sprites/animations/NuclearA1.png differ diff --git a/electron/files/images/sprites/animations/PBlob.png b/electron/files/images/sprites/animations/PBlob.png new file mode 100644 index 0000000..1ae04d4 Binary files /dev/null and b/electron/files/images/sprites/animations/PBlob.png differ diff --git a/electron/files/images/sprites/animations/Poison.png b/electron/files/images/sprites/animations/Poison.png new file mode 100755 index 0000000..3ecf530 Binary files /dev/null and b/electron/files/images/sprites/animations/Poison.png differ diff --git a/electron/files/images/sprites/animations/Puff.png b/electron/files/images/sprites/animations/Puff.png new file mode 100755 index 0000000..9fb03fd Binary files /dev/null and b/electron/files/images/sprites/animations/Puff.png differ diff --git a/electron/files/images/sprites/animations/PuffR.png b/electron/files/images/sprites/animations/PuffR.png new file mode 100644 index 0000000..fc3a89d Binary files /dev/null and b/electron/files/images/sprites/animations/PuffR.png differ diff --git a/electron/files/images/sprites/animations/Shield1.png b/electron/files/images/sprites/animations/Shield1.png new file mode 100755 index 0000000..1407dd4 Binary files /dev/null and b/electron/files/images/sprites/animations/Shield1.png differ diff --git a/electron/files/images/sprites/animations/Shield_Invincible.png b/electron/files/images/sprites/animations/Shield_Invincible.png new file mode 100644 index 0000000..751ce4c Binary files /dev/null and b/electron/files/images/sprites/animations/Shield_Invincible.png differ diff --git a/electron/files/images/sprites/animations/Sick.png b/electron/files/images/sprites/animations/Sick.png new file mode 100755 index 0000000..721c27a Binary files /dev/null and b/electron/files/images/sprites/animations/Sick.png differ diff --git a/electron/files/images/sprites/animations/Slash0.png b/electron/files/images/sprites/animations/Slash0.png new file mode 100755 index 0000000..c4a013f Binary files /dev/null and b/electron/files/images/sprites/animations/Slash0.png differ diff --git a/electron/files/images/sprites/animations/Slash0Arrow.png b/electron/files/images/sprites/animations/Slash0Arrow.png new file mode 100644 index 0000000..25585bf Binary files /dev/null and b/electron/files/images/sprites/animations/Slash0Arrow.png differ diff --git a/electron/files/images/sprites/animations/Slash0Super.png b/electron/files/images/sprites/animations/Slash0Super.png new file mode 100644 index 0000000..75fd443 Binary files /dev/null and b/electron/files/images/sprites/animations/Slash0Super.png differ diff --git a/electron/files/images/sprites/animations/Slash1.png b/electron/files/images/sprites/animations/Slash1.png new file mode 100755 index 0000000..93f8fb4 Binary files /dev/null and b/electron/files/images/sprites/animations/Slash1.png differ diff --git a/electron/files/images/sprites/animations/Slash2Quick.png b/electron/files/images/sprites/animations/Slash2Quick.png new file mode 100644 index 0000000..041e2d5 Binary files /dev/null and b/electron/files/images/sprites/animations/Slash2Quick.png differ diff --git a/electron/files/images/sprites/animations/Slash3.png b/electron/files/images/sprites/animations/Slash3.png new file mode 100644 index 0000000..f368a62 Binary files /dev/null and b/electron/files/images/sprites/animations/Slash3.png differ diff --git a/electron/files/images/sprites/animations/Spark0.png b/electron/files/images/sprites/animations/Spark0.png new file mode 100755 index 0000000..80369b9 Binary files /dev/null and b/electron/files/images/sprites/animations/Spark0.png differ diff --git a/electron/files/images/sprites/animations/Tangle.png b/electron/files/images/sprites/animations/Tangle.png new file mode 100644 index 0000000..530b483 Binary files /dev/null and b/electron/files/images/sprites/animations/Tangle.png differ diff --git a/electron/files/images/sprites/animations/Teleport1P.png b/electron/files/images/sprites/animations/Teleport1P.png new file mode 100644 index 0000000..3a48309 Binary files /dev/null and b/electron/files/images/sprites/animations/Teleport1P.png differ diff --git a/electron/files/images/sprites/animations/Teleport2.png b/electron/files/images/sprites/animations/Teleport2.png new file mode 100755 index 0000000..dda9d25 Binary files /dev/null and b/electron/files/images/sprites/animations/Teleport2.png differ diff --git a/electron/files/images/sprites/animations/TeleportInv.png b/electron/files/images/sprites/animations/TeleportInv.png new file mode 100644 index 0000000..77e68ac Binary files /dev/null and b/electron/files/images/sprites/animations/TeleportInv.png differ diff --git a/electron/files/images/sprites/animations/arrow1.png b/electron/files/images/sprites/animations/arrow1.png new file mode 100644 index 0000000..9bee760 Binary files /dev/null and b/electron/files/images/sprites/animations/arrow1.png differ diff --git a/electron/files/images/sprites/animations/arrow2.png b/electron/files/images/sprites/animations/arrow2.png new file mode 100644 index 0000000..2c11f6c Binary files /dev/null and b/electron/files/images/sprites/animations/arrow2.png differ diff --git a/electron/files/images/sprites/animations/attack3.png b/electron/files/images/sprites/animations/attack3.png new file mode 100644 index 0000000..40c7142 Binary files /dev/null and b/electron/files/images/sprites/animations/attack3.png differ diff --git a/electron/files/images/sprites/animations/burst.png b/electron/files/images/sprites/animations/burst.png new file mode 100644 index 0000000..99a314a Binary files /dev/null and b/electron/files/images/sprites/animations/burst.png differ diff --git a/electron/files/images/sprites/animations/confetti2.png b/electron/files/images/sprites/animations/confetti2.png new file mode 100644 index 0000000..7787b85 Binary files /dev/null and b/electron/files/images/sprites/animations/confetti2.png differ diff --git a/electron/files/images/sprites/animations/crackingIce.png b/electron/files/images/sprites/animations/crackingIce.png new file mode 100644 index 0000000..970b6c1 Binary files /dev/null and b/electron/files/images/sprites/animations/crackingIce.png differ diff --git a/electron/files/images/sprites/animations/curse.png b/electron/files/images/sprites/animations/curse.png new file mode 100644 index 0000000..326dd78 Binary files /dev/null and b/electron/files/images/sprites/animations/curse.png differ diff --git a/electron/files/images/sprites/animations/curseAttack.png b/electron/files/images/sprites/animations/curseAttack.png new file mode 100644 index 0000000..2682666 Binary files /dev/null and b/electron/files/images/sprites/animations/curseAttack.png differ diff --git a/electron/files/images/sprites/animations/fireArrow.png b/electron/files/images/sprites/animations/fireArrow.png new file mode 100644 index 0000000..42c4733 Binary files /dev/null and b/electron/files/images/sprites/animations/fireArrow.png differ diff --git a/electron/files/images/sprites/animations/fireball.png b/electron/files/images/sprites/animations/fireball.png new file mode 100644 index 0000000..2acf3a0 Binary files /dev/null and b/electron/files/images/sprites/animations/fireball.png differ diff --git a/electron/files/images/sprites/animations/frostArrow.png b/electron/files/images/sprites/animations/frostArrow.png new file mode 100644 index 0000000..35dc5e0 Binary files /dev/null and b/electron/files/images/sprites/animations/frostArrow.png differ diff --git a/electron/files/images/sprites/animations/frostball.png b/electron/files/images/sprites/animations/frostball.png new file mode 100644 index 0000000..84d2338 Binary files /dev/null and b/electron/files/images/sprites/animations/frostball.png differ diff --git a/electron/files/images/sprites/animations/garrow.png b/electron/files/images/sprites/animations/garrow.png new file mode 100644 index 0000000..8c5e0e9 Binary files /dev/null and b/electron/files/images/sprites/animations/garrow.png differ diff --git a/electron/files/images/sprites/animations/gold.png b/electron/files/images/sprites/animations/gold.png new file mode 100644 index 0000000..8b40060 Binary files /dev/null and b/electron/files/images/sprites/animations/gold.png differ diff --git a/electron/files/images/sprites/animations/gold_anim.png b/electron/files/images/sprites/animations/gold_anim.png new file mode 100644 index 0000000..0fd2c62 Binary files /dev/null and b/electron/files/images/sprites/animations/gold_anim.png differ diff --git a/electron/files/images/sprites/animations/healAttack.png b/electron/files/images/sprites/animations/healAttack.png new file mode 100644 index 0000000..c325bcf Binary files /dev/null and b/electron/files/images/sprites/animations/healAttack.png differ diff --git a/electron/files/images/sprites/animations/heartedArrow.png b/electron/files/images/sprites/animations/heartedArrow.png new file mode 100644 index 0000000..3c91df1 Binary files /dev/null and b/electron/files/images/sprites/animations/heartedArrow.png differ diff --git a/electron/files/images/sprites/animations/lightningBurst3.png b/electron/files/images/sprites/animations/lightningBurst3.png new file mode 100644 index 0000000..0569dec Binary files /dev/null and b/electron/files/images/sprites/animations/lightningBurst3.png differ diff --git a/electron/files/images/sprites/animations/magic0.png b/electron/files/images/sprites/animations/magic0.png new file mode 100644 index 0000000..9011b73 Binary files /dev/null and b/electron/files/images/sprites/animations/magic0.png differ diff --git a/electron/files/images/sprites/animations/magic1.png b/electron/files/images/sprites/animations/magic1.png new file mode 100644 index 0000000..0367d0a Binary files /dev/null and b/electron/files/images/sprites/animations/magic1.png differ diff --git a/electron/files/images/sprites/animations/magic2.png b/electron/files/images/sprites/animations/magic2.png new file mode 100644 index 0000000..139a52e Binary files /dev/null and b/electron/files/images/sprites/animations/magic2.png differ diff --git a/electron/files/images/sprites/animations/magic3.png b/electron/files/images/sprites/animations/magic3.png new file mode 100644 index 0000000..5bcf969 Binary files /dev/null and b/electron/files/images/sprites/animations/magic3.png differ diff --git a/electron/files/images/sprites/animations/magic4.png b/electron/files/images/sprites/animations/magic4.png new file mode 100644 index 0000000..19161de Binary files /dev/null and b/electron/files/images/sprites/animations/magic4.png differ diff --git a/electron/files/images/sprites/animations/partyHeal.png b/electron/files/images/sprites/animations/partyHeal.png new file mode 100644 index 0000000..65750e9 Binary files /dev/null and b/electron/files/images/sprites/animations/partyHeal.png differ diff --git a/electron/files/images/sprites/animations/pinky.png b/electron/files/images/sprites/animations/pinky.png new file mode 100644 index 0000000..cf3b4ae Binary files /dev/null and b/electron/files/images/sprites/animations/pinky.png differ diff --git a/electron/files/images/sprites/animations/pouchArrow.png b/electron/files/images/sprites/animations/pouchArrow.png new file mode 100644 index 0000000..86432a5 Binary files /dev/null and b/electron/files/images/sprites/animations/pouchArrow.png differ diff --git a/electron/files/images/sprites/animations/reflection.png b/electron/files/images/sprites/animations/reflection.png new file mode 100644 index 0000000..9cd752b Binary files /dev/null and b/electron/files/images/sprites/animations/reflection.png differ diff --git a/electron/files/images/sprites/animations/slash.png b/electron/files/images/sprites/animations/slash.png new file mode 100644 index 0000000..9844ac7 Binary files /dev/null and b/electron/files/images/sprites/animations/slash.png differ diff --git a/electron/files/images/sprites/animations/snowball_hit.png b/electron/files/images/sprites/animations/snowball_hit.png new file mode 100644 index 0000000..7d242b9 Binary files /dev/null and b/electron/files/images/sprites/animations/snowball_hit.png differ diff --git a/electron/files/images/sprites/animations/snowball_projectile.png b/electron/files/images/sprites/animations/snowball_projectile.png new file mode 100644 index 0000000..33c8d81 Binary files /dev/null and b/electron/files/images/sprites/animations/snowball_projectile.png differ diff --git a/electron/files/images/sprites/animations/snowflake.png b/electron/files/images/sprites/animations/snowflake.png new file mode 100644 index 0000000..254c0ce Binary files /dev/null and b/electron/files/images/sprites/animations/snowflake.png differ diff --git a/electron/files/images/sprites/animations/terrorAcid.png b/electron/files/images/sprites/animations/terrorAcid.png new file mode 100644 index 0000000..58dee73 Binary files /dev/null and b/electron/files/images/sprites/animations/terrorAcid.png differ diff --git a/electron/files/images/sprites/animations/typingAnim.png b/electron/files/images/sprites/animations/typingAnim.png new file mode 100644 index 0000000..9bdc8bf Binary files /dev/null and b/electron/files/images/sprites/animations/typingAnim.png differ diff --git a/electron/files/images/sprites/animations/wandy.png b/electron/files/images/sprites/animations/wandy.png new file mode 100644 index 0000000..0d159ac Binary files /dev/null and b/electron/files/images/sprites/animations/wandy.png differ diff --git a/electron/files/images/sprites/animations/warrior_shield.png b/electron/files/images/sprites/animations/warrior_shield.png new file mode 100644 index 0000000..81faffb Binary files /dev/null and b/electron/files/images/sprites/animations/warrior_shield.png differ diff --git a/electron/files/images/sprites/animations/wslash.png b/electron/files/images/sprites/animations/wslash.png new file mode 100644 index 0000000..5a2897d Binary files /dev/null and b/electron/files/images/sprites/animations/wslash.png differ diff --git a/electron/files/images/sprites/emblems/emblems.png b/electron/files/images/sprites/emblems/emblems.png new file mode 100644 index 0000000..45de389 Binary files /dev/null and b/electron/files/images/sprites/emblems/emblems.png differ diff --git a/electron/files/images/sprites/emotions/heart_rise_single.png b/electron/files/images/sprites/emotions/heart_rise_single.png new file mode 100644 index 0000000..e76a386 Binary files /dev/null and b/electron/files/images/sprites/emotions/heart_rise_single.png differ diff --git a/electron/files/images/sprites/weather/fog.png b/electron/files/images/sprites/weather/fog.png new file mode 100644 index 0000000..da256c7 Binary files /dev/null and b/electron/files/images/sprites/weather/fog.png differ diff --git a/electron/files/images/sprites/weather/wsheet_rain1_1.png b/electron/files/images/sprites/weather/wsheet_rain1_1.png new file mode 100644 index 0000000..e14af8b Binary files /dev/null and b/electron/files/images/sprites/weather/wsheet_rain1_1.png differ diff --git a/electron/files/images/sprites/weather/wsheet_snow_1.png b/electron/files/images/sprites/weather/wsheet_snow_1.png new file mode 100644 index 0000000..265407b Binary files /dev/null and b/electron/files/images/sprites/weather/wsheet_snow_1.png differ diff --git a/electron/files/images/tiles/animations/custom/crackle1.png b/electron/files/images/tiles/animations/custom/crackle1.png new file mode 100644 index 0000000..783fe34 Binary files /dev/null and b/electron/files/images/tiles/animations/custom/crackle1.png differ diff --git a/electron/files/images/tiles/characters/adversaries.png b/electron/files/images/tiles/characters/adversaries.png new file mode 100644 index 0000000..9384901 Binary files /dev/null and b/electron/files/images/tiles/characters/adversaries.png differ diff --git a/electron/files/images/tiles/characters/angel_wingless.png b/electron/files/images/tiles/characters/angel_wingless.png new file mode 100755 index 0000000..4e3928f Binary files /dev/null and b/electron/files/images/tiles/characters/angel_wingless.png differ diff --git a/electron/files/images/tiles/characters/animation1i.png b/electron/files/images/tiles/characters/animation1i.png new file mode 100644 index 0000000..dd597a7 Binary files /dev/null and b/electron/files/images/tiles/characters/animation1i.png differ diff --git a/electron/files/images/tiles/characters/animation2.png b/electron/files/images/tiles/characters/animation2.png new file mode 100755 index 0000000..20ad1af Binary files /dev/null and b/electron/files/images/tiles/characters/animation2.png differ diff --git a/electron/files/images/tiles/characters/animation3.png b/electron/files/images/tiles/characters/animation3.png new file mode 100755 index 0000000..add9d97 Binary files /dev/null and b/electron/files/images/tiles/characters/animation3.png differ diff --git a/electron/files/images/tiles/characters/animationc.png b/electron/files/images/tiles/characters/animationc.png new file mode 100644 index 0000000..15db580 Binary files /dev/null and b/electron/files/images/tiles/characters/animationc.png differ diff --git a/electron/files/images/tiles/characters/automatron2.png b/electron/files/images/tiles/characters/automatron2.png new file mode 100644 index 0000000..593a3c8 Binary files /dev/null and b/electron/files/images/tiles/characters/automatron2.png differ diff --git a/electron/files/images/tiles/characters/bonus1.png b/electron/files/images/tiles/characters/bonus1.png new file mode 100755 index 0000000..e4d7d9f Binary files /dev/null and b/electron/files/images/tiles/characters/bonus1.png differ diff --git a/electron/files/images/tiles/characters/chara2.png b/electron/files/images/tiles/characters/chara2.png new file mode 100755 index 0000000..411af48 Binary files /dev/null and b/electron/files/images/tiles/characters/chara2.png differ diff --git a/electron/files/images/tiles/characters/chara3.png b/electron/files/images/tiles/characters/chara3.png new file mode 100755 index 0000000..929d52e Binary files /dev/null and b/electron/files/images/tiles/characters/chara3.png differ diff --git a/electron/files/images/tiles/characters/chara4.png b/electron/files/images/tiles/characters/chara4.png new file mode 100755 index 0000000..e951073 Binary files /dev/null and b/electron/files/images/tiles/characters/chara4.png differ diff --git a/electron/files/images/tiles/characters/chara5.png b/electron/files/images/tiles/characters/chara5.png new file mode 100755 index 0000000..816ae86 Binary files /dev/null and b/electron/files/images/tiles/characters/chara5.png differ diff --git a/electron/files/images/tiles/characters/chara6.png b/electron/files/images/tiles/characters/chara6.png new file mode 100755 index 0000000..26ecf43 Binary files /dev/null and b/electron/files/images/tiles/characters/chara6.png differ diff --git a/electron/files/images/tiles/characters/chara7.png b/electron/files/images/tiles/characters/chara7.png new file mode 100755 index 0000000..a2471e0 Binary files /dev/null and b/electron/files/images/tiles/characters/chara7.png differ diff --git a/electron/files/images/tiles/characters/chara8.png b/electron/files/images/tiles/characters/chara8.png new file mode 100755 index 0000000..c64269d Binary files /dev/null and b/electron/files/images/tiles/characters/chara8.png differ diff --git a/electron/files/images/tiles/characters/collection1.png b/electron/files/images/tiles/characters/collection1.png new file mode 100644 index 0000000..920ad45 Binary files /dev/null and b/electron/files/images/tiles/characters/collection1.png differ diff --git a/electron/files/images/tiles/characters/collection2.png b/electron/files/images/tiles/characters/collection2.png new file mode 100644 index 0000000..f682a6a Binary files /dev/null and b/electron/files/images/tiles/characters/collection2.png differ diff --git a/electron/files/images/tiles/characters/collection3.png b/electron/files/images/tiles/characters/collection3.png new file mode 100644 index 0000000..5805b1e Binary files /dev/null and b/electron/files/images/tiles/characters/collection3.png differ diff --git a/electron/files/images/tiles/characters/collectionx.png b/electron/files/images/tiles/characters/collectionx.png new file mode 100644 index 0000000..0922163 Binary files /dev/null and b/electron/files/images/tiles/characters/collectionx.png differ diff --git a/electron/files/images/tiles/characters/custom1.png b/electron/files/images/tiles/characters/custom1.png new file mode 100644 index 0000000..f22fe32 Binary files /dev/null and b/electron/files/images/tiles/characters/custom1.png differ diff --git a/electron/files/images/tiles/characters/custom2.png b/electron/files/images/tiles/characters/custom2.png new file mode 100644 index 0000000..8510008 Binary files /dev/null and b/electron/files/images/tiles/characters/custom2.png differ diff --git a/electron/files/images/tiles/characters/custom3.png b/electron/files/images/tiles/characters/custom3.png new file mode 100644 index 0000000..ed5c057 Binary files /dev/null and b/electron/files/images/tiles/characters/custom3.png differ diff --git a/electron/files/images/tiles/characters/dwarf2.png b/electron/files/images/tiles/characters/dwarf2.png new file mode 100755 index 0000000..9447e9f Binary files /dev/null and b/electron/files/images/tiles/characters/dwarf2.png differ diff --git a/electron/files/images/tiles/characters/knights.png b/electron/files/images/tiles/characters/knights.png new file mode 100644 index 0000000..920ed19 Binary files /dev/null and b/electron/files/images/tiles/characters/knights.png differ diff --git a/electron/files/images/tiles/characters/military2.png b/electron/files/images/tiles/characters/military2.png new file mode 100755 index 0000000..64c6d8d Binary files /dev/null and b/electron/files/images/tiles/characters/military2.png differ diff --git a/electron/files/images/tiles/characters/military3.png b/electron/files/images/tiles/characters/military3.png new file mode 100755 index 0000000..8cff83e Binary files /dev/null and b/electron/files/images/tiles/characters/military3.png differ diff --git a/electron/files/images/tiles/characters/mystics.png b/electron/files/images/tiles/characters/mystics.png new file mode 100644 index 0000000..c65dc1c Binary files /dev/null and b/electron/files/images/tiles/characters/mystics.png differ diff --git a/electron/files/images/tiles/characters/ninja_turtles.png b/electron/files/images/tiles/characters/ninja_turtles.png new file mode 100644 index 0000000..77e6b72 Binary files /dev/null and b/electron/files/images/tiles/characters/ninja_turtles.png differ diff --git a/electron/files/images/tiles/characters/npc1.png b/electron/files/images/tiles/characters/npc1.png new file mode 100755 index 0000000..d2dfef7 Binary files /dev/null and b/electron/files/images/tiles/characters/npc1.png differ diff --git a/electron/files/images/tiles/characters/npc3.png b/electron/files/images/tiles/characters/npc3.png new file mode 100755 index 0000000..d82fd41 Binary files /dev/null and b/electron/files/images/tiles/characters/npc3.png differ diff --git a/electron/files/images/tiles/characters/npc4.png b/electron/files/images/tiles/characters/npc4.png new file mode 100755 index 0000000..d52f7ec Binary files /dev/null and b/electron/files/images/tiles/characters/npc4.png differ diff --git a/electron/files/images/tiles/characters/npc5.png b/electron/files/images/tiles/characters/npc5.png new file mode 100755 index 0000000..e0163d1 Binary files /dev/null and b/electron/files/images/tiles/characters/npc5.png differ diff --git a/electron/files/images/tiles/characters/npc6.png b/electron/files/images/tiles/characters/npc6.png new file mode 100755 index 0000000..0f7c410 Binary files /dev/null and b/electron/files/images/tiles/characters/npc6.png differ diff --git a/electron/files/images/tiles/characters/others/jsonX.png b/electron/files/images/tiles/characters/others/jsonX.png new file mode 100644 index 0000000..a314129 Binary files /dev/null and b/electron/files/images/tiles/characters/others/jsonX.png differ diff --git a/electron/files/images/tiles/characters/others/newyear_tree.png b/electron/files/images/tiles/characters/others/newyear_tree.png new file mode 100644 index 0000000..741e6e6 Binary files /dev/null and b/electron/files/images/tiles/characters/others/newyear_tree.png differ diff --git a/electron/files/images/tiles/characters/others/ship2.png b/electron/files/images/tiles/characters/others/ship2.png new file mode 100644 index 0000000..112160f Binary files /dev/null and b/electron/files/images/tiles/characters/others/ship2.png differ diff --git a/electron/files/images/tiles/characters/sheet_winnersa.png b/electron/files/images/tiles/characters/sheet_winnersa.png new file mode 100644 index 0000000..87608f7 Binary files /dev/null and b/electron/files/images/tiles/characters/sheet_winnersa.png differ diff --git a/electron/files/images/tiles/characters/sheet_winnersb.png b/electron/files/images/tiles/characters/sheet_winnersb.png new file mode 100644 index 0000000..a82b90f Binary files /dev/null and b/electron/files/images/tiles/characters/sheet_winnersb.png differ diff --git a/electron/files/images/tiles/characters/tristone_f.png b/electron/files/images/tiles/characters/tristone_f.png new file mode 100644 index 0000000..f16447a Binary files /dev/null and b/electron/files/images/tiles/characters/tristone_f.png differ diff --git a/electron/files/images/tiles/characters/tristone_m.png b/electron/files/images/tiles/characters/tristone_m.png new file mode 100644 index 0000000..0d743c0 Binary files /dev/null and b/electron/files/images/tiles/characters/tristone_m.png differ diff --git a/electron/files/images/tiles/characters/winners_jpa.png b/electron/files/images/tiles/characters/winners_jpa.png new file mode 100644 index 0000000..541dd10 Binary files /dev/null and b/electron/files/images/tiles/characters/winners_jpa.png differ diff --git a/electron/files/images/tiles/characters/winners_jpb.png b/electron/files/images/tiles/characters/winners_jpb.png new file mode 100644 index 0000000..f5bf026 Binary files /dev/null and b/electron/files/images/tiles/characters/winners_jpb.png differ diff --git a/electron/files/images/tiles/items/chests.png b/electron/files/images/tiles/items/chests.png new file mode 100755 index 0000000..3743c58 Binary files /dev/null and b/electron/files/images/tiles/items/chests.png differ diff --git a/electron/files/images/tiles/items/custom.png b/electron/files/images/tiles/items/custom.png new file mode 100644 index 0000000..7d36af9 Binary files /dev/null and b/electron/files/images/tiles/items/custom.png differ diff --git a/electron/files/images/tiles/items/pack_1a.png b/electron/files/images/tiles/items/pack_1a.png new file mode 100755 index 0000000..98849f2 Binary files /dev/null and b/electron/files/images/tiles/items/pack_1a.png differ diff --git a/electron/files/images/tiles/items/pack_20vt6.png b/electron/files/images/tiles/items/pack_20vt6.png new file mode 100644 index 0000000..13b56e4 Binary files /dev/null and b/electron/files/images/tiles/items/pack_20vt6.png differ diff --git a/electron/files/images/tiles/items/skills_20v5.png b/electron/files/images/tiles/items/skills_20v5.png new file mode 100644 index 0000000..2b62ac9 Binary files /dev/null and b/electron/files/images/tiles/items/skills_20v5.png differ diff --git a/electron/files/images/tiles/items/stands.png b/electron/files/images/tiles/items/stands.png new file mode 100644 index 0000000..4495a20 Binary files /dev/null and b/electron/files/images/tiles/items/stands.png differ diff --git a/electron/files/images/tiles/map/ashlands.png b/electron/files/images/tiles/map/ashlands.png new file mode 100644 index 0000000..1661c32 Binary files /dev/null and b/electron/files/images/tiles/map/ashlands.png differ diff --git a/electron/files/images/tiles/map/beach_v2.png b/electron/files/images/tiles/map/beach_v2.png new file mode 100644 index 0000000..5b35247 Binary files /dev/null and b/electron/files/images/tiles/map/beach_v2.png differ diff --git a/electron/files/images/tiles/map/castle.png b/electron/files/images/tiles/map/castle.png new file mode 100755 index 0000000..b2962d8 Binary files /dev/null and b/electron/files/images/tiles/map/castle.png differ diff --git a/electron/files/images/tiles/map/custom.png b/electron/files/images/tiles/map/custom.png new file mode 100644 index 0000000..2138221 Binary files /dev/null and b/electron/files/images/tiles/map/custom.png differ diff --git a/electron/files/images/tiles/map/custom2.png b/electron/files/images/tiles/map/custom2.png new file mode 100644 index 0000000..118e0f6 Binary files /dev/null and b/electron/files/images/tiles/map/custom2.png differ diff --git a/electron/files/images/tiles/map/custom_a.png b/electron/files/images/tiles/map/custom_a.png new file mode 100644 index 0000000..6b91d37 Binary files /dev/null and b/electron/files/images/tiles/map/custom_a.png differ diff --git a/electron/files/images/tiles/map/dark_dimension.png b/electron/files/images/tiles/map/dark_dimension.png new file mode 100644 index 0000000..bd232a9 Binary files /dev/null and b/electron/files/images/tiles/map/dark_dimension.png differ diff --git a/electron/files/images/tiles/map/doors.png b/electron/files/images/tiles/map/doors.png new file mode 100755 index 0000000..0792a4b Binary files /dev/null and b/electron/files/images/tiles/map/doors.png differ diff --git a/electron/files/images/tiles/map/dungeon.png b/electron/files/images/tiles/map/dungeon.png new file mode 100755 index 0000000..9367e40 Binary files /dev/null and b/electron/files/images/tiles/map/dungeon.png differ diff --git a/electron/files/images/tiles/map/fort.png b/electron/files/images/tiles/map/fort.png new file mode 100755 index 0000000..23501f9 Binary files /dev/null and b/electron/files/images/tiles/map/fort.png differ diff --git a/electron/files/images/tiles/map/house.png b/electron/files/images/tiles/map/house.png new file mode 100755 index 0000000..73b7e21 Binary files /dev/null and b/electron/files/images/tiles/map/house.png differ diff --git a/electron/files/images/tiles/map/inside.png b/electron/files/images/tiles/map/inside.png new file mode 100644 index 0000000..8b5528e Binary files /dev/null and b/electron/files/images/tiles/map/inside.png differ diff --git a/electron/files/images/tiles/map/jungle.png b/electron/files/images/tiles/map/jungle.png new file mode 100755 index 0000000..a7d25a3 Binary files /dev/null and b/electron/files/images/tiles/map/jungle.png differ diff --git a/electron/files/images/tiles/map/new.png b/electron/files/images/tiles/map/new.png new file mode 100644 index 0000000..7b29d8a Binary files /dev/null and b/electron/files/images/tiles/map/new.png differ diff --git a/electron/files/images/tiles/map/outside.png b/electron/files/images/tiles/map/outside.png new file mode 100644 index 0000000..49283bf Binary files /dev/null and b/electron/files/images/tiles/map/outside.png differ diff --git a/electron/files/images/tiles/map/puzzle.png b/electron/files/images/tiles/map/puzzle.png new file mode 100755 index 0000000..3a8ab8e Binary files /dev/null and b/electron/files/images/tiles/map/puzzle.png differ diff --git a/electron/files/images/tiles/map/ruins.png b/electron/files/images/tiles/map/ruins.png new file mode 100644 index 0000000..cdeca35 Binary files /dev/null and b/electron/files/images/tiles/map/ruins.png differ diff --git a/electron/files/images/tiles/map/ship.png b/electron/files/images/tiles/map/ship.png new file mode 100755 index 0000000..da07532 Binary files /dev/null and b/electron/files/images/tiles/map/ship.png differ diff --git a/electron/files/images/tiles/map/tree.png b/electron/files/images/tiles/map/tree.png new file mode 100755 index 0000000..9cd093d Binary files /dev/null and b/electron/files/images/tiles/map/tree.png differ diff --git a/electron/files/images/tiles/map/water_updated.png b/electron/files/images/tiles/map/water_updated.png new file mode 100644 index 0000000..6f6d895 Binary files /dev/null and b/electron/files/images/tiles/map/water_updated.png differ diff --git a/electron/files/images/tiles/map/winter.png b/electron/files/images/tiles/map/winter.png new file mode 100644 index 0000000..64c6a42 Binary files /dev/null and b/electron/files/images/tiles/map/winter.png differ diff --git a/electron/files/images/tiles/map/world.png b/electron/files/images/tiles/map/world.png new file mode 100755 index 0000000..387b982 Binary files /dev/null and b/electron/files/images/tiles/map/world.png differ diff --git a/electron/files/images/tiles/monsters/Dragold.png b/electron/files/images/tiles/monsters/Dragold.png new file mode 100644 index 0000000..1a33eb6 Binary files /dev/null and b/electron/files/images/tiles/monsters/Dragold.png differ diff --git a/electron/files/images/tiles/monsters/animals1.png b/electron/files/images/tiles/monsters/animals1.png new file mode 100755 index 0000000..b7cf575 Binary files /dev/null and b/electron/files/images/tiles/monsters/animals1.png differ diff --git a/electron/files/images/tiles/monsters/animals2.png b/electron/files/images/tiles/monsters/animals2.png new file mode 100755 index 0000000..dd39c3b Binary files /dev/null and b/electron/files/images/tiles/monsters/animals2.png differ diff --git a/electron/files/images/tiles/monsters/birds1_modded.png b/electron/files/images/tiles/monsters/birds1_modded.png new file mode 100644 index 0000000..cf004c4 Binary files /dev/null and b/electron/files/images/tiles/monsters/birds1_modded.png differ diff --git a/electron/files/images/tiles/monsters/blackscorpion.png b/electron/files/images/tiles/monsters/blackscorpion.png new file mode 100644 index 0000000..4ab0b72 Binary files /dev/null and b/electron/files/images/tiles/monsters/blackscorpion.png differ diff --git a/electron/files/images/tiles/monsters/cbee.png b/electron/files/images/tiles/monsters/cbee.png new file mode 100644 index 0000000..dd7003a Binary files /dev/null and b/electron/files/images/tiles/monsters/cbee.png differ diff --git a/electron/files/images/tiles/monsters/coboldProto.png b/electron/files/images/tiles/monsters/coboldProto.png new file mode 100644 index 0000000..547287f Binary files /dev/null and b/electron/files/images/tiles/monsters/coboldProto.png differ diff --git a/electron/files/images/tiles/monsters/creatures1.png b/electron/files/images/tiles/monsters/creatures1.png new file mode 100644 index 0000000..49bda59 Binary files /dev/null and b/electron/files/images/tiles/monsters/creatures1.png differ diff --git a/electron/files/images/tiles/monsters/creatures2.png b/electron/files/images/tiles/monsters/creatures2.png new file mode 100644 index 0000000..c7c0a39 Binary files /dev/null and b/electron/files/images/tiles/monsters/creatures2.png differ diff --git a/electron/files/images/tiles/monsters/custom1.png b/electron/files/images/tiles/monsters/custom1.png new file mode 100644 index 0000000..3b96d98 Binary files /dev/null and b/electron/files/images/tiles/monsters/custom1.png differ diff --git a/electron/files/images/tiles/monsters/custom2.png b/electron/files/images/tiles/monsters/custom2.png new file mode 100644 index 0000000..205a8e9 Binary files /dev/null and b/electron/files/images/tiles/monsters/custom2.png differ diff --git a/electron/files/images/tiles/monsters/deep_sea_king.png b/electron/files/images/tiles/monsters/deep_sea_king.png new file mode 100644 index 0000000..894f866 Binary files /dev/null and b/electron/files/images/tiles/monsters/deep_sea_king.png differ diff --git a/electron/files/images/tiles/monsters/elemental.png b/electron/files/images/tiles/monsters/elemental.png new file mode 100755 index 0000000..bbaaee8 Binary files /dev/null and b/electron/files/images/tiles/monsters/elemental.png differ diff --git a/electron/files/images/tiles/monsters/fairies.png b/electron/files/images/tiles/monsters/fairies.png new file mode 100644 index 0000000..096ad39 Binary files /dev/null and b/electron/files/images/tiles/monsters/fairies.png differ diff --git a/electron/files/images/tiles/monsters/frankenstein.png b/electron/files/images/tiles/monsters/frankenstein.png new file mode 100644 index 0000000..c1c958a Binary files /dev/null and b/electron/files/images/tiles/monsters/frankenstein.png differ diff --git a/electron/files/images/tiles/monsters/goblinkingb.png b/electron/files/images/tiles/monsters/goblinkingb.png new file mode 100644 index 0000000..f9b679c Binary files /dev/null and b/electron/files/images/tiles/monsters/goblinkingb.png differ diff --git a/electron/files/images/tiles/monsters/goblinos.png b/electron/files/images/tiles/monsters/goblinos.png new file mode 100644 index 0000000..d01fa62 Binary files /dev/null and b/electron/files/images/tiles/monsters/goblinos.png differ diff --git a/electron/files/images/tiles/monsters/green.png b/electron/files/images/tiles/monsters/green.png new file mode 100644 index 0000000..762000f Binary files /dev/null and b/electron/files/images/tiles/monsters/green.png differ diff --git a/electron/files/images/tiles/monsters/grinch.png b/electron/files/images/tiles/monsters/grinch.png new file mode 100644 index 0000000..c7281d8 Binary files /dev/null and b/electron/files/images/tiles/monsters/grinch.png differ diff --git a/electron/files/images/tiles/monsters/iceGolem.png b/electron/files/images/tiles/monsters/iceGolem.png new file mode 100644 index 0000000..40ea99c Binary files /dev/null and b/electron/files/images/tiles/monsters/iceGolem.png differ diff --git a/electron/files/images/tiles/monsters/jrpumpkins.png b/electron/files/images/tiles/monsters/jrpumpkins.png new file mode 100644 index 0000000..68d7004 Binary files /dev/null and b/electron/files/images/tiles/monsters/jrpumpkins.png differ diff --git a/electron/files/images/tiles/monsters/json.png b/electron/files/images/tiles/monsters/json.png new file mode 100644 index 0000000..1d3defc Binary files /dev/null and b/electron/files/images/tiles/monsters/json.png differ diff --git a/electron/files/images/tiles/monsters/liger_x.png b/electron/files/images/tiles/monsters/liger_x.png new file mode 100644 index 0000000..3cf1363 Binary files /dev/null and b/electron/files/images/tiles/monsters/liger_x.png differ diff --git a/electron/files/images/tiles/monsters/mage.png b/electron/files/images/tiles/monsters/mage.png new file mode 100755 index 0000000..ecaf63c Binary files /dev/null and b/electron/files/images/tiles/monsters/mage.png differ diff --git a/electron/files/images/tiles/monsters/mecha_gnome.png b/electron/files/images/tiles/monsters/mecha_gnome.png new file mode 100644 index 0000000..3b79d4f Binary files /dev/null and b/electron/files/images/tiles/monsters/mecha_gnome.png differ diff --git a/electron/files/images/tiles/monsters/monster1.png b/electron/files/images/tiles/monsters/monster1.png new file mode 100755 index 0000000..3dd67cb Binary files /dev/null and b/electron/files/images/tiles/monsters/monster1.png differ diff --git a/electron/files/images/tiles/monsters/monster2.png b/electron/files/images/tiles/monsters/monster2.png new file mode 100755 index 0000000..6ca0b37 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster2.png differ diff --git a/electron/files/images/tiles/monsters/monster3c.png b/electron/files/images/tiles/monsters/monster3c.png new file mode 100644 index 0000000..ceff424 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster3c.png differ diff --git a/electron/files/images/tiles/monsters/monster4.png b/electron/files/images/tiles/monsters/monster4.png new file mode 100755 index 0000000..cbdee9a Binary files /dev/null and b/electron/files/images/tiles/monsters/monster4.png differ diff --git a/electron/files/images/tiles/monsters/monster_bird1.png b/electron/files/images/tiles/monsters/monster_bird1.png new file mode 100755 index 0000000..9083c77 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_bird1.png differ diff --git a/electron/files/images/tiles/monsters/monster_bird2.png b/electron/files/images/tiles/monsters/monster_bird2.png new file mode 100755 index 0000000..77f8944 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_bird2.png differ diff --git a/electron/files/images/tiles/monsters/monster_bird3.png b/electron/files/images/tiles/monsters/monster_bird3.png new file mode 100755 index 0000000..59085c7 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_bird3.png differ diff --git a/electron/files/images/tiles/monsters/monster_boar.png b/electron/files/images/tiles/monsters/monster_boar.png new file mode 100755 index 0000000..48a2674 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_boar.png differ diff --git a/electron/files/images/tiles/monsters/monster_cacto.png b/electron/files/images/tiles/monsters/monster_cacto.png new file mode 100755 index 0000000..f886794 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_cacto.png differ diff --git a/electron/files/images/tiles/monsters/monster_dknight1.png b/electron/files/images/tiles/monsters/monster_dknight1.png new file mode 100755 index 0000000..d56d559 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_dknight1.png differ diff --git a/electron/files/images/tiles/monsters/monster_dknight2.png b/electron/files/images/tiles/monsters/monster_dknight2.png new file mode 100755 index 0000000..b591acd Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_dknight2.png differ diff --git a/electron/files/images/tiles/monsters/monster_elk.png b/electron/files/images/tiles/monsters/monster_elk.png new file mode 100755 index 0000000..41decb7 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_elk.png differ diff --git a/electron/files/images/tiles/monsters/monster_golem1.png b/electron/files/images/tiles/monsters/monster_golem1.png new file mode 100755 index 0000000..3ab9e4c Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_golem1.png differ diff --git a/electron/files/images/tiles/monsters/monster_golem2.png b/electron/files/images/tiles/monsters/monster_golem2.png new file mode 100755 index 0000000..c19eb48 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_golem2.png differ diff --git a/electron/files/images/tiles/monsters/monster_lich.png b/electron/files/images/tiles/monsters/monster_lich.png new file mode 100755 index 0000000..d3d7fa7 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_lich.png differ diff --git a/electron/files/images/tiles/monsters/monster_lizardman1.png b/electron/files/images/tiles/monsters/monster_lizardman1.png new file mode 100755 index 0000000..2d7a6d5 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_lizardman1.png differ diff --git a/electron/files/images/tiles/monsters/monster_lizardman2.png b/electron/files/images/tiles/monsters/monster_lizardman2.png new file mode 100755 index 0000000..739b02a Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_lizardman2.png differ diff --git a/electron/files/images/tiles/monsters/monster_minotaur.png b/electron/files/images/tiles/monsters/monster_minotaur.png new file mode 100755 index 0000000..3002138 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_minotaur.png differ diff --git a/electron/files/images/tiles/monsters/monster_phoenix.png b/electron/files/images/tiles/monsters/monster_phoenix.png new file mode 100755 index 0000000..a59ad93 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_phoenix.png differ diff --git a/electron/files/images/tiles/monsters/monster_raptor1.png b/electron/files/images/tiles/monsters/monster_raptor1.png new file mode 100755 index 0000000..099aa9b Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_raptor1.png differ diff --git a/electron/files/images/tiles/monsters/monster_raptor2.png b/electron/files/images/tiles/monsters/monster_raptor2.png new file mode 100755 index 0000000..eefc036 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_raptor2.png differ diff --git a/electron/files/images/tiles/monsters/monster_treant.png b/electron/files/images/tiles/monsters/monster_treant.png new file mode 100755 index 0000000..b8a14af Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_treant.png differ diff --git a/electron/files/images/tiles/monsters/monster_wolf1.png b/electron/files/images/tiles/monsters/monster_wolf1.png new file mode 100755 index 0000000..111f4a7 Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_wolf1.png differ diff --git a/electron/files/images/tiles/monsters/monster_wolf2.png b/electron/files/images/tiles/monsters/monster_wolf2.png new file mode 100755 index 0000000..e1a89cb Binary files /dev/null and b/electron/files/images/tiles/monsters/monster_wolf2.png differ diff --git a/electron/files/images/tiles/monsters/monsterc2.png b/electron/files/images/tiles/monsters/monsterc2.png new file mode 100644 index 0000000..5aad98a Binary files /dev/null and b/electron/files/images/tiles/monsters/monsterc2.png differ diff --git a/electron/files/images/tiles/monsters/monsterc6.png b/electron/files/images/tiles/monsters/monsterc6.png new file mode 100644 index 0000000..85da4fe Binary files /dev/null and b/electron/files/images/tiles/monsters/monsterc6.png differ diff --git a/electron/files/images/tiles/monsters/mr_pumpkin.png b/electron/files/images/tiles/monsters/mr_pumpkin.png new file mode 100644 index 0000000..1e54664 Binary files /dev/null and b/electron/files/images/tiles/monsters/mr_pumpkin.png differ diff --git a/electron/files/images/tiles/monsters/robots.png b/electron/files/images/tiles/monsters/robots.png new file mode 100644 index 0000000..5f9398f Binary files /dev/null and b/electron/files/images/tiles/monsters/robots.png differ diff --git a/electron/files/images/tiles/monsters/rudolphi.png b/electron/files/images/tiles/monsters/rudolphi.png new file mode 100644 index 0000000..5a769f8 Binary files /dev/null and b/electron/files/images/tiles/monsters/rudolphi.png differ diff --git a/electron/files/images/tiles/monsters/snowman.png b/electron/files/images/tiles/monsters/snowman.png new file mode 100644 index 0000000..a800219 Binary files /dev/null and b/electron/files/images/tiles/monsters/snowman.png differ diff --git a/electron/files/images/tiles/monsters/stompy3.png b/electron/files/images/tiles/monsters/stompy3.png new file mode 100644 index 0000000..786d563 Binary files /dev/null and b/electron/files/images/tiles/monsters/stompy3.png differ diff --git a/electron/files/images/tiles/monsters/tinyfairies.png b/electron/files/images/tiles/monsters/tinyfairies.png new file mode 100644 index 0000000..246cb78 Binary files /dev/null and b/electron/files/images/tiles/monsters/tinyfairies.png differ diff --git a/electron/files/images/tiles/monsters/vampire2d.png b/electron/files/images/tiles/monsters/vampire2d.png new file mode 100644 index 0000000..d79940a Binary files /dev/null and b/electron/files/images/tiles/monsters/vampire2d.png differ diff --git a/electron/files/sounds/effects/click_natural.wav b/electron/files/sounds/effects/click_natural.wav new file mode 100644 index 0000000..bb6b24b Binary files /dev/null and b/electron/files/sounds/effects/click_natural.wav differ diff --git a/electron/files/sounds/fx/8BIT_RETRO_Fire_Blaster_Short_mono.wav b/electron/files/sounds/fx/8BIT_RETRO_Fire_Blaster_Short_mono.wav new file mode 100755 index 0000000..db99d9b Binary files /dev/null and b/electron/files/sounds/fx/8BIT_RETRO_Fire_Blaster_Short_mono.wav differ diff --git a/electron/files/sounds/fx/8BIT_RETRO_Hit_Bump_Noise_mono.wav b/electron/files/sounds/fx/8BIT_RETRO_Hit_Bump_Noise_mono.wav new file mode 100755 index 0000000..309527b Binary files /dev/null and b/electron/files/sounds/fx/8BIT_RETRO_Hit_Bump_Noise_mono.wav differ diff --git a/electron/files/sounds/fx/ANIMAL_Duck_08_mono.wav b/electron/files/sounds/fx/ANIMAL_Duck_08_mono.wav new file mode 100755 index 0000000..f79367b Binary files /dev/null and b/electron/files/sounds/fx/ANIMAL_Duck_08_mono.wav differ diff --git a/electron/files/sounds/fx/CLASP_Plastic_Open_stereo.wav b/electron/files/sounds/fx/CLASP_Plastic_Open_stereo.wav new file mode 100755 index 0000000..835e802 Binary files /dev/null and b/electron/files/sounds/fx/CLASP_Plastic_Open_stereo.wav differ diff --git a/electron/files/sounds/fx/DROP_Designed_mono.wav b/electron/files/sounds/fx/DROP_Designed_mono.wav new file mode 100755 index 0000000..5d650dd Binary files /dev/null and b/electron/files/sounds/fx/DROP_Designed_mono.wav differ diff --git a/electron/files/sounds/fx/EXPLOSION_Short_Kickback_Crackle_stereo.wav b/electron/files/sounds/fx/EXPLOSION_Short_Kickback_Crackle_stereo.wav new file mode 100755 index 0000000..dfc5ce3 Binary files /dev/null and b/electron/files/sounds/fx/EXPLOSION_Short_Kickback_Crackle_stereo.wav differ diff --git a/electron/files/sounds/fx/Explosive01.wav b/electron/files/sounds/fx/Explosive01.wav new file mode 100755 index 0000000..6c7e273 Binary files /dev/null and b/electron/files/sounds/fx/Explosive01.wav differ diff --git a/electron/files/sounds/fx/Explosive02.wav b/electron/files/sounds/fx/Explosive02.wav new file mode 100755 index 0000000..0b642f2 Binary files /dev/null and b/electron/files/sounds/fx/Explosive02.wav differ diff --git a/electron/files/sounds/fx/FOOTSTEP_Asphalt_Trainers_Walk_Slow_RR5_mono.wav b/electron/files/sounds/fx/FOOTSTEP_Asphalt_Trainers_Walk_Slow_RR5_mono.wav new file mode 100755 index 0000000..b28884a Binary files /dev/null and b/electron/files/sounds/fx/FOOTSTEP_Asphalt_Trainers_Walk_Slow_RR5_mono.wav differ diff --git a/electron/files/sounds/fx/MAGIC_SPELL_Spawn_mono.wav b/electron/files/sounds/fx/MAGIC_SPELL_Spawn_mono.wav new file mode 100755 index 0000000..560dd9e Binary files /dev/null and b/electron/files/sounds/fx/MAGIC_SPELL_Spawn_mono.wav differ diff --git a/electron/files/sounds/fx/MUSIC_EFFECT_Bell_Voice_Positive_09_stereo.wav b/electron/files/sounds/fx/MUSIC_EFFECT_Bell_Voice_Positive_09_stereo.wav new file mode 100755 index 0000000..5d67cee Binary files /dev/null and b/electron/files/sounds/fx/MUSIC_EFFECT_Bell_Voice_Positive_09_stereo.wav differ diff --git a/electron/files/sounds/fx/UI_Beep_Double_Quick_Smooth_stereo.wav b/electron/files/sounds/fx/UI_Beep_Double_Quick_Smooth_stereo.wav new file mode 100755 index 0000000..9da7a72 Binary files /dev/null and b/electron/files/sounds/fx/UI_Beep_Double_Quick_Smooth_stereo.wav differ diff --git a/electron/files/sounds/fx/VideoGameSFX_blip_07.wav b/electron/files/sounds/fx/VideoGameSFX_blip_07.wav new file mode 100755 index 0000000..92f8374 Binary files /dev/null and b/electron/files/sounds/fx/VideoGameSFX_blip_07.wav differ diff --git a/electron/files/sounds/fx/WHOOSH_Air_Fast_Wind_RR1_mono.wav b/electron/files/sounds/fx/WHOOSH_Air_Fast_Wind_RR1_mono.wav new file mode 100755 index 0000000..a981115 Binary files /dev/null and b/electron/files/sounds/fx/WHOOSH_Air_Fast_Wind_RR1_mono.wav differ diff --git a/electron/files/sounds/fx/pop_plink.wav b/electron/files/sounds/fx/pop_plink.wav new file mode 100644 index 0000000..ffc0101 Binary files /dev/null and b/electron/files/sounds/fx/pop_plink.wav differ diff --git a/electron/files/sounds/fx/zap_drum.wav b/electron/files/sounds/fx/zap_drum.wav new file mode 100644 index 0000000..bd09319 Binary files /dev/null and b/electron/files/sounds/fx/zap_drum.wav differ diff --git a/electron/files/sounds/loops/casual_05_loop.ogg b/electron/files/sounds/loops/casual_05_loop.ogg new file mode 100755 index 0000000..7a7804e Binary files /dev/null and b/electron/files/sounds/loops/casual_05_loop.ogg differ diff --git a/electron/files/sounds/loops/christmas.ogg b/electron/files/sounds/loops/christmas.ogg new file mode 100644 index 0000000..2d824e7 Binary files /dev/null and b/electron/files/sounds/loops/christmas.ogg differ diff --git a/electron/files/sounds/loops/empty_loop_for_js_performance.ogg b/electron/files/sounds/loops/empty_loop_for_js_performance.ogg new file mode 100644 index 0000000..68b9b16 Binary files /dev/null and b/electron/files/sounds/loops/empty_loop_for_js_performance.ogg differ diff --git a/electron/files/sounds/loops/empty_loop_for_js_performance.wav b/electron/files/sounds/loops/empty_loop_for_js_performance.wav new file mode 100644 index 0000000..a62e42f Binary files /dev/null and b/electron/files/sounds/loops/empty_loop_for_js_performance.wav differ diff --git a/electron/files/sounds/loops/horror_01_loop.ogg b/electron/files/sounds/loops/horror_01_loop.ogg new file mode 100644 index 0000000..c26c964 Binary files /dev/null and b/electron/files/sounds/loops/horror_01_loop.ogg differ diff --git a/electron/files/sounds/loops/horror_02_loop.ogg b/electron/files/sounds/loops/horror_02_loop.ogg new file mode 100755 index 0000000..0d5ef7b Binary files /dev/null and b/electron/files/sounds/loops/horror_02_loop.ogg differ diff --git a/electron/files/sounds/loops/rpg_07_loop.ogg b/electron/files/sounds/loops/rpg_07_loop.ogg new file mode 100755 index 0000000..56ac878 Binary files /dev/null and b/electron/files/sounds/loops/rpg_07_loop.ogg differ diff --git a/electron/files/sounds/loops/rpg_08_loop.ogg b/electron/files/sounds/loops/rpg_08_loop.ogg new file mode 100644 index 0000000..6514705 Binary files /dev/null and b/electron/files/sounds/loops/rpg_08_loop.ogg differ diff --git a/electron/files/sounds/loops/rpg_10_loop.ogg b/electron/files/sounds/loops/rpg_10_loop.ogg new file mode 100755 index 0000000..1ee0d45 Binary files /dev/null and b/electron/files/sounds/loops/rpg_10_loop.ogg differ diff --git a/electron/files/sounds/loops/rpg_14_loop.ogg b/electron/files/sounds/loops/rpg_14_loop.ogg new file mode 100755 index 0000000..0da4af2 Binary files /dev/null and b/electron/files/sounds/loops/rpg_14_loop.ogg differ diff --git a/electron/files/sounds/loops/rpg_16_loop.ogg b/electron/files/sounds/loops/rpg_16_loop.ogg new file mode 100755 index 0000000..f4c9bfd Binary files /dev/null and b/electron/files/sounds/loops/rpg_16_loop.ogg differ diff --git a/electron/greenworks.js b/electron/greenworks.js new file mode 100755 index 0000000..03964d0 --- /dev/null +++ b/electron/greenworks.js @@ -0,0 +1,215 @@ +// Copyright (c) 2015 Greenheart Games Pty. Ltd. All rights reserved. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +// The source code can be found in https://github.com/greenheartgames/greenworks +var fs = require('fs'); + +var greenworks; + +if (process.platform == 'darwin') { + if (process.arch == 'x64') + greenworks = require('./lib/greenworks-osx64'); +} else if (process.platform == 'win32') { + if (process.arch == 'x64') + greenworks = require('./lib/greenworks-win64'); + else if (process.arch == 'ia32') + greenworks = require('./lib/greenworks-win32'); +} else if (process.platform == 'linux') { + if (process.arch == 'x64') + greenworks = require('./lib/greenworks-linux64'); + else if (process.arch == 'ia32') + greenworks = require('./lib/greenworks-linux32'); +} + +function error_process(err, error_callback) { + if (err && error_callback) + error_callback(err); +} + +greenworks.ugcGetItems = function(options, ugc_matching_type, ugc_query_type, + success_callback, error_callback) { + if (typeof options !== 'object') { + error_callback = success_callback; + success_callback = ugc_query_type; + ugc_query_type = ugc_matching_type; + ugc_matching_type = options; + options = { + 'app_id': greenworks.getAppId(), + 'page_num': 1 + } + } + greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type, + success_callback, error_callback); +} + +greenworks.ugcGetUserItems = function(options, ugc_matching_type, + ugc_list_sort_order, ugc_list, success_callback, error_callback) { + if (typeof options !== 'object') { + error_callback = success_callback; + success_callback = ugc_list; + ugc_list = ugc_list_sort_order; + ugc_list_sort_order = ugc_matching_type; + ugc_matching_type = options; + options = { + 'app_id': greenworks.getAppId(), + 'page_num': 1 + } + } + greenworks._ugcGetUserItems(options, ugc_matching_type, ugc_list_sort_order, + ugc_list, success_callback, error_callback); +} + +greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback, + error_callback) { + if (typeof options !== 'object') { + error_callback = success_callback; + success_callback = sync_dir; + sync_dir = options; + options = { + 'app_id': greenworks.getAppId(), + 'page_num': 1 + } + } + greenworks._ugcSynchronizeItems(options, sync_dir, success_callback, + error_callback); +} + +greenworks.publishWorkshopFile = function(options, file_path, image_path, title, + description, success_callback, error_callback) { + if (typeof options !== 'object') { + error_callback = success_callback; + success_callback = description; + description = title; + title = image_path; + image_path = file_path; + file_path = options; + options = { + 'app_id': greenworks.getAppId(), + 'tags': [] + } + } + greenworks._publishWorkshopFile(options, file_path, image_path, title, + description, success_callback, error_callback); +} + +greenworks.updatePublishedWorkshopFile = function(options, + published_file_handle, file_path, image_path, title, description, + success_callback, error_callback) { + if (typeof options !== 'object') { + error_callback = success_callback; + success_callback = description; + description = title; + title = image_path; + image_path = file_path; + file_path = published_file_handle; + published_file_handle = options; + options = { + 'tags': [] // No tags are set + } + } + greenworks._updatePublishedWorkshopFile(options, published_file_handle, + file_path, image_path, title, description, success_callback, + error_callback); +} + +// An utility function for publish related APIs. +// It processes remains steps after saving files to Steam Cloud. +function file_share_process(file_name, image_name, next_process_func, + error_callback, progress_callback) { + if (progress_callback) + progress_callback("Completed on saving files on Steam Cloud."); + greenworks.fileShare(file_name, function() { + greenworks.fileShare(image_name, function() { + next_process_func(); + }, function(err) { error_process(err, error_callback); }); + }, function(err) { error_process(err, error_callback); }); +} + +// Publishing user generated content(ugc) to Steam contains following steps: +// 1. Save file and image to Steam Cloud. +// 2. Share the file and image. +// 3. publish the file to workshop. +greenworks.ugcPublish = function(file_name, title, description, image_name, + success_callback, error_callback, progress_callback) { + var publish_file_process = function() { + if (progress_callback) + progress_callback("Completed on sharing files."); + greenworks.publishWorkshopFile(file_name, image_name, title, description, + function(publish_file_id) { success_callback(publish_file_id); }, + function(err) { error_process(err, error_callback); }); + }; + greenworks.saveFilesToCloud([file_name, image_name], function() { + file_share_process(file_name, image_name, publish_file_process, + error_callback, progress_callback); + }, function(err) { error_process(err, error_callback); }); +} + +// Update publish ugc steps: +// 1. Save new file and image to Steam Cloud. +// 2. Share file and images. +// 3. Update published file. +greenworks.ugcPublishUpdate = function(published_file_id, file_name, title, + description, image_name, success_callback, error_callback, + progress_callback) { + var update_published_file_process = function() { + if (progress_callback) + progress_callback("Completed on sharing files."); + greenworks.updatePublishedWorkshopFile(published_file_id, + file_name, image_name, title, description, + function() { success_callback(); }, + function(err) { error_process(err, error_callback); }); + }; + + greenworks.saveFilesToCloud([file_name, image_name], function() { + file_share_process(file_name, image_name, update_published_file_process, + error_callback, progress_callback); + }, function(err) { error_process(err, error_callback); }); +} + +// Greenworks Utils APIs implmentation. +greenworks.Utils.move = function(source_dir, target_dir, success_callback, + error_callback) { + fs.rename(source_dir, target_dir, function(err) { + if (err) { + if (error_callback) error_callback(err); + return; + } + if (success_callback) + success_callback(); + }); +} + +greenworks.init = function() { + if (this.initAPI()) return true; + if (!this.isSteamRunning()) + throw new Error("Steam initialization failed. Steam is not running."); + var appId; + try { + appId = fs.readFileSync('steam_appid.txt', 'utf8'); + } catch (e) { + throw new Error("Steam initialization failed. Steam is running," + + "but steam_appid.txt is missing. Expected to find it in: " + + require('path').resolve('steam_appid.txt')); + } + if (!/^\d+ *\r?\n?$/.test(appId)) { + throw new Error("Steam initialization failed. " + + "steam_appid.txt appears to be invalid; " + + "it should contain a numeric ID: " + appId); + } + throw new Error("Steam initialization failed, but Steam is running, " + + "and steam_appid.txt is present and valid." + + "Maybe that's not really YOUR app ID? " + appId.trim()); +} + +var EventEmitter = require('events').EventEmitter; +greenworks.__proto__ = EventEmitter.prototype; +EventEmitter.call(greenworks); + +greenworks._steam_events.on = function () { + greenworks.emit.apply(greenworks, arguments); +}; + +process.versions['greenworks'] = greenworks._version; + +module.exports = greenworks; \ No newline at end of file diff --git a/electron/info.txt b/electron/info.txt new file mode 100755 index 0000000..5ee5827 --- /dev/null +++ b/electron/info.txt @@ -0,0 +1,109 @@ +[COMMANDS] +cd thegame/electron +a) electron . +b) electron-packager . --platform=darwin --arch=x64 --out=dist/ --electron-version=3.0.9 --no-tmpdir +c) electron-packager . --platform=mas --arch=x64 --out=dist/ --electron-version=3.0.9 --no-tmpdir + +[ICON] +0) https://www.npmjs.com/package/png2icons +1) png2icons Icon2.png mac -icns -hm +2) png2icons Icon2.png icon -ico -hm #for Steam, needs to be a BMP ICO +IMPORTANT) Use http://www.png2ico.com/ for Windows - One size is missing with png2icons + +[LIBRARIES] +npm install electron-store --save +npm install path --save +npm install fs-extra --save + +[CERTIFICATE SUGGESTION] [27/06/20] +Request certificates from XCode +Create .provisionprofile from https://developer.apple.com/account/resources/profiles/list + +[MAS] +[13/11/18] +-1) security find-identity + +0) node ~/thegame/scripts/electron_bundle.js +0.1) electron-packager . --platform=mas --arch=x64 --out=dist/ --electron-version=8.3.4 --overwrite --appBundleId="land.adventure.rpg" --appCategoryType="public.app-category.games" --appVersion="1.3.1" --darwin-dark-mode-support=1 --icon=mac.icns --extend-info=dist/extra-info.plist --ignore="(dist/*|info.txt|lib|greenworks.js)" [13/11/18] +1) Copy .provisionprofile to the Contents folder of the .app renamed as embedded.provisionprofile +1.1) cp dist/embedded.provisionprofile dist/Adventure\ Land-mas-x64/Adventure\ Land.app/Contents +1.1) xattr -cr dist/Adventure\ Land-mas-x64/Adventure\ Land.app <<<<- fixes a new issue related to Finder attributes/references etc. [05/12/18] +2) electron-osx-sign dist/Adventure\ Land-mas-x64/Adventure\ Land.app --provisioning-profile=dist/embedded.provisionprofile --entitlements=dist/entitlements.plist <<<<- uses Mac App Store Distribution Certificate +3) electron-osx-flat dist/Adventure\ Land-mas-x64/Adventure\ Land.app --platform=mas <<<<- uses Mac Installer Distribution Certificate + +[UPLOAD MAS] +Application Loader -> Transporter Now +App-Specific-Password: masters.py + +[STEAM] +After the build, set it live here: https://partner.steamgames.com/apps/builds/777150 + +[MAC STEAM] +0) node ~/thegame/scripts/electron_bundle.js +1) electron-packager . --platform=darwin --arch=x64 --out=dist/ --electron-version=8.3.4 --overwrite --appBundleId="land.adventure.rpg" --appCategoryType="public.app-category.games" --appVersion=1.3.1 --darwin-dark-mode-support=1 --icon=mac.icns --extend-info=dist/extra-info.plist --ignore="(dist/*|info.txt)" + + electron-packager . --platform=darwin --arch=x64 --out=dist/ --electron-version=13.1.4 --overwrite --appBundleId="land.adventure.rpg" --appCategoryType="public.app-category.games" --appVersion=1.4.4 --darwin-dark-mode-support=1 --icon=mac.icns --extend-info=dist/extra-info.plist --ignore="(dist/*|info.txt)" +2) cp steam_appid.txt dist/Adventure\ Land-darwin-x64 +IMPORTANT) Open all .Framework's / Copy Versions/A folder contents to the main folders [29/06/21] +2.X) xattr -cr dist/Adventure\ Land-darwin-x64/Adventure\ Land.app +2.TEST) cp dist/steam.provisionprofile dist/Adventure\ Land-darwin-x64/Adventure\ Land.app/Contents/embedded.provisionprofile +2.TEST) electron-osx-sign dist/Adventure\ Land-darwin-x64/Adventure\ Land.app --provisioning-profile=dist/steam.provisionprofile --entitlements=dist/entitlements.plist --identity="3rd Party Mac Developer Application: Kaan Soral (8PHV3WUSUP)" +2.XX) DONT RUN THE APP BEFORE UPLOAD - might be causing the ERROR! Build for depot 777152 failed : Failure's +[MAC UPLOAD] +0) rm -rf ~/thegame/electron/dist/steamworks_sdk/tools/ContentBuilder/content/* +0.1) cp -a ~/thegame/electron/dist/Adventure\ Land-darwin-x64/ ~/thegame/electron/dist/steamworks_sdk/tools/ContentBuilder/content/ +1) cd ~/thegame/electron/dist/steamworks_sdk/tools/ContentBuilder/builder_osx +1.1) chmod +x steamcmd +1.2) chmod +x steamcmd.sh +2) ./steamcmd.sh +3) login kaansoral +4) run_app_build /Users/kaan/Desktop/PROJECTS/thegame/thegame/electron/dist/steamworks_sdk/tools/ContentBuilder/scripts/app_build_777150.vdf + +Test 1) codesign -dvvv --entitlements :- dist/Adventure\ Land-mas-x64/Adventure\ Land.app + +[WINDOWS STEAM] +npm info electron +npm install electron@8.3.4 -g +electron -v + +cd /cygdrive/c/Users/K/Desktop/electron/ +npm install + +copy/paste greenworks-win64.node and .dll's from steamworks_sdk to /lib IMPORTANT: DLL's are in 2 places: steamworks/public/steam/lib and redistributable_bin + +echo 777150 > steam_appid.txt + +electron-packager . --platform=win32 --arch=ia32 --out=dist/ --electron-version=8.3.4 --app-version=1.3.0 --asar +electron-packager . --platform=win32 --out=dist/ --electron-version=8.3.4 --app-version=1.3.0 +COPY/PASTE steam_appid.txt + +Icon sizes: 256 128 64 48 40 32 16 -- gold: http://icoconvert.com/image_to_icon_converter/ +To replace ICO, right click + "Open Using Resource Hacker" -> go to Icon Group, replace the icon with .ico there + +STEAM DEPOT UPLOAD: https://www.youtube.com/watch?v=SoNH-v6aU9Q +TIP: Press Enter to complete tasks +> Replace old files with new files, change version.txt +> steamcmd.exe +> login kaansoral +> run_app_build C:\Users\K\Desktop\electron\dist\steamworks_sdk\tools\ContentBuilder\scripts\app_build_777150.vdf + +[LINUX STEAM] +1) electron-packager . --platform=linux --arch=x64 --out=dist/ --electron-version=3.1.3 --overwrite --appVersion="1.2.9" --ignore=dist/* +[LINUX UPLOAD] +0) cd /home/kaan/Desktop/electron/dist/steamworks_sdk/tools/ContentBuilder/builder_linux/linux32 +0.1) chmod +x steamcmd +1) cd /home/kaan/Desktop/electron/dist/steamworks_sdk/tools/ContentBuilder/builder_linux +1.1) chmod +x steamcmd.sh +2) ./steamcmd.sh +3) run_app_build /home/kaan/Desktop/electron/dist/steamworks_sdk/tools/ContentBuilder/scripts/app_build_777150.vdf + +[18/08/16] +In package.json, "productName" and "" is for npm/electron-packager +--tmpdir=false -> https://github.com/electron-userland/electron-packager/issues/375 + +[ELECTRON] +1.3.3 - severe ERR_CONTENT_DECODING_FAILED and ERR_CACHE_READ_FAILURE issues +1.4.0 - switched at [18/09/16] + +[BUILDS] +b131116 [13/11/16] \ No newline at end of file diff --git a/electron/lib/.DS_Store b/electron/lib/.DS_Store new file mode 100644 index 0000000..9627c57 Binary files /dev/null and b/electron/lib/.DS_Store differ diff --git a/electron/lib/greenworks-osx32.node b/electron/lib/greenworks-osx32.node new file mode 100644 index 0000000..91c2b9e Binary files /dev/null and b/electron/lib/greenworks-osx32.node differ diff --git a/electron/lib/greenworks-osx64.node b/electron/lib/greenworks-osx64.node new file mode 100644 index 0000000..19481d6 Binary files /dev/null and b/electron/lib/greenworks-osx64.node differ diff --git a/electron/lib/libsdkencryptedappticket.dylib b/electron/lib/libsdkencryptedappticket.dylib new file mode 100644 index 0000000..8fca3aa Binary files /dev/null and b/electron/lib/libsdkencryptedappticket.dylib differ diff --git a/electron/lib/libsteam_api.dylib b/electron/lib/libsteam_api.dylib new file mode 100644 index 0000000..8b4a95a Binary files /dev/null and b/electron/lib/libsteam_api.dylib differ diff --git a/electron/mac.icns b/electron/mac.icns new file mode 100644 index 0000000..cd29036 Binary files /dev/null and b/electron/mac.icns differ diff --git a/electron/main.js b/electron/main.js new file mode 100755 index 0000000..9c04b25 --- /dev/null +++ b/electron/main.js @@ -0,0 +1,338 @@ +// process.env.TMPDIR="/var/folders/s5/sd0cnc0j6kqgmhp05yc_h_nr0000gn/T/x/"; //"/Users/kaan/test/"; +const {app, BrowserWindow, Menu} = require('electron'); +var electron=require('electron'); +var Store=require('electron-store'),store=new Store(); +var path=require('path'); +var ipcMain=require('electron').ipcMain; + +var main=null,sub=null,loader=null; +var platform="steam"; +var osf=100; +try{osf=parseFloat(require('os').release());}catch(e){}; +var dev=1; +var recording_mode=0; +var screenshot_mode=0; +var closing=false; +var build="b260621"; +var url="https://adventure.land/"; + +if(dev) +{ + url="http://thegame.com/"; +} + +var width=1440,height=900; // perfect resolution +if(recording_mode) +{ + if(!screenshot_mode) width=1320,height=820; + url=url+"?recording_mode=true"; +} + +if(platform=="steam") +{ + if(process.platform == 'win32') app.commandLine.appendSwitch("in-process-gpu"); // For Shift+Tab to work + try{ + greenworks = require('./greenworks'); + if (greenworks.init()) + { + console.log('Steam API has been initalized.'); + greenworks.getEncryptedAppTicket('adventurelandticketv0', function(ticket) { + console.log('Steam ticket loaded'); + var ticket=ticket.toString('hex'); + store.set('ticket',ticket); + }, function(err) { + electron.dialog.showErrorBox("Adventure Land","Steam Ticket Failed: "+err); + console.log(err); + }); + } + }catch(e){ + electron.dialog.showErrorBox("Adventure Land","Steam Integration Failed: "+e); + } +} + +// app.commandLine.appendSwitch('limit-fps', 20); + +ipcMain.on('create_subwindow',function(event){ + create_subwindow(); +}); + +ipcMain.on('show_subwindow',function(event){ + //main.hide(); + //sub.show(); + sub.moveTop(); +}); + +ipcMain.on('show_mainwindow',function(event){ + //sub.hide(); + //main.show(); + main.moveTop(); +}); + +function add_window_events(bwindow) +{ + if(process.platform == 'win32') bwindow.removeMenu(); + + bwindow.webContents.on('will-navigate', (e,wurl) => { + if(!is_url_safe(wurl)){ + e.preventDefault(); + electron.dialog.showErrorBox("Adventure Land","External url blocked. The game window can't be navigated elsewhere for security reasons."); + } + }); + + bwindow.webContents.on('new-window', (event, wurl, frameName, disposition, options, additionalFeatures) => { + event.preventDefault(); + if(!recording_mode && !is_url_safe(wurl)) + { + electron.dialog.showErrorBox("Adventure Land","External window blocked. The game can't open external webpages for security reasons."); + return; + } + if(recording_mode) wurl=wurl+"?recording_mode=true"; + Object.assign(options,{ + parent: null, + width:width, + height:height+22, + sideWindow:true, + webPreferences:{ + backgroundThrottling:false, + webSecurity:false, + nodeIntegration:true, + contextIsolation:false, + nodeIntegrationInSubFrames:true, + enableRemoteModule:true, + }, + }); + var char = new BrowserWindow(options); + char.cdata={ + platform:platform, + build:build + } + add_window_events(char); + char.loadURL(wurl); + // event.newGuest=char; + }); +} + +function is_url_safe(wurl) +{ + return wurl.replace("https","").replace("http","").startsWith(url.replace("https","").replace("http","")); +} + +function create_subwindow() +{ + sub=new BrowserWindow({ + show:false, + width:width, + height:height+22, + backgroundColor:'#000000', + disableAutoHideCursor:true, //awesome, doesn't hide the mouse on keypress + webPreferences:{ + backgroundThrottling:false, + webSecurity:false, + nodeIntegration:true, + contextIsolation:false, + nodeIntegrationInSubFrames:true, + enableRemoteModule:true, + }, + parent:main, + modal:true, + }); + sub.cdata={ + platform:platform, + build:build + } + sub.loadURL(url+'?buildid='+build+'-'+process.platform); + 0 && sub.webContents.once('dom-ready',function(){ + setTimeout(function(){ + sub.show(); + //main.hide(); + },600); + }); + add_window_events(sub); + sub.on('closed', () => { + sub=null; + }); +} + +function create_window() +{ + // electron.dialog.showErrorBox("Adventure Land",process.env.TMPDIR); + main=new BrowserWindow({ + show:false, + width:width, + height:height+22, + backgroundColor:'#000000', + disableAutoHideCursor:true, //awesome, doesn't hide the mouse on keypress + webPreferences:{ + backgroundThrottling:false, + webSecurity:false, + nodeIntegration:true, + contextIsolation:false, + nodeIntegrationInSubFrames:true, + enableRemoteModule:true, + }, + }); + main.cdata={ + platform:platform, + build:build + } + + loader=new BrowserWindow({ + show:false, + width:width, + height:height+22, + backgroundColor:'#000000', + //frame:false + }); + + var w7=(process.platform=="win32")&&(osf<=6.3) + if(w7 && !store.get("win7v2")) + { + loader.loadURL('file://'+path.resolve(app.getAppPath(),'./resources/w7loader.html')); + store.set("win7v2",1); + } + else if(w7) + { + loader.loadURL('file://'+path.resolve(app.getAppPath(),'./resources/w7rloader.html')); + } + else loader.loadURL('file://'+path.resolve(app.getAppPath(),'./resources/loader.html')); + + main.loadURL(url+'?buildid='+build+'-'+process.platform); + + loader.once('show',function(){ + // create_window(); + }); + + loader.on('closed', () => { + loader=null; + }); + + if(process.platform == 'win32') loader.removeMenu(); + + loader.webContents.once('dom-ready',function(){ + loader.show(); + }); + + main.webContents.once('dom-ready',function(){ + setTimeout(function(){ + if(loader) + { + main.show(); + loader.hide(); + loader.close(); + } + else + { + closing=true; + main.close(); + } + },600); + }); + + + // if(dev) main.webContents.openDevTools(); + + add_window_events(main); + + // Emitted when the window is closed. + main.on('closed', () => { + main=null; + }); + + main.on('close', function(e){ + // return; + if(closing) return; + var choice = require('electron').dialog.showMessageBoxSync(this,{ + type: 'question', + buttons: ['Yes', 'No'], + title: 'Confirm', + message: 'Are you sure you want to close Adventure Land?' + }); + if(choice==1) + { + e.preventDefault(); + } + }); + if(process.platform == 'darwin') + { + try{ + var menu = Menu.buildFromTemplate(darwin_menu); + Menu.setApplicationMenu(menu); + }catch(e){ + // require('electron').dialog.showErrorBox("Adventure Land","Menu error: "+e); + } + } +} + +var darwin_menu=[ + { + label: app.getName(), + submenu: [ + {role: 'about'}, + {type: 'separator'}, + {role: 'hide'}, + {role: 'hideothers'}, + {role: 'unhide'}, + {type: 'separator'}, + {role: 'quit'} + ] + }, + { + label: 'Edit', + submenu: [ + {role: 'undo'}, + {role: 'redo'}, + {type: 'separator'}, + {role: 'cut'}, + {role: 'copy'}, + {role: 'paste'}, + {role: 'pasteandmatchstyle'}, + {role: 'delete'}, + {role: 'selectall'} + ] + }, + { + label: 'Tools', + submenu: [ + {label:"Inspector",role: 'toggledevtools'}, + {type: 'separator'}, + {role: 'reload'}, + {type: 'separator'}, + {role: 'resetzoom'}, + {role: 'zoomin'}, + {role: 'zoomout'}, + {type: 'separator'}, + {role: 'togglefullscreen'} + ] + }, +]; + +var got_the_lock=1; +if(process.platform=="win32") got_the_lock=app.requestSingleInstanceLock(); + +if(store.get("http_mode")) url=url.replace("https","http"); // for testing + +if(!got_the_lock) app.quit(); +else +{ + if(process.platform=="win32") + app.on('second-instance', (event, commandLine, workingDirectory) => { + if (main) { + if (main.isMinimized()) main.restore(); + main.focus() + } + }); + + app.on('ready',create_window); + + // Quit when all windows are closed. + app.on('window-all-closed',function(){ + if(process.platform !== 'darwin' || 1) + { + app.quit() + } + }); + + app.on('activate',function(){ + if(main===null) create_window(); + }) +} \ No newline at end of file diff --git a/electron/manifest.js b/electron/manifest.js new file mode 100644 index 0000000..3476120 --- /dev/null +++ b/electron/manifest.js @@ -0,0 +1,2 @@ +// Sat Jun 26 2021 20:14:33 GMT+0300 (GMT+03:00) +module.exports={"/images/tiles/characters/ninja_turtles.png":{"height":144,"width":312,"type":"png"},"/images/cosmetics/makeup/makeup1.png":{"height":120,"width":1107,"type":"png","v":"5"},"/images/cosmetics/hairdo/bwhair.png":{"height":120,"width":27,"type":"png","v":"2"},"/images/cosmetics/beardo/burningeyes1_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/beardo/burningeyes2_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/hats/bathat_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/hats/gcandle_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/hats/halo_anim.png":{"height":120,"width":81,"type":"png"},"/images/cosmetics/makeup/kunique.png":{"height":120,"width":108,"type":"png","v":"2"},"/images/cosmetics/skins/mbw.png":{"height":144,"width":81,"type":"png"},"/images/cosmetics/armors/mabw.png":{"height":144,"width":162,"type":"png","v":"2"},"/images/cosmetics/accessories/kglasses.png":{"height":120,"width":108,"type":"png","v":"3"},"/images/cosmetics/gravestones/gravestone.png":{"height":64,"width":160,"type":"png"},"/images/tiles/monsters/deep_sea_king.png":{"height":320,"width":318,"type":"png"},"/images/tiles/characters/adversaries.png":{"height":288,"width":324,"type":"png"},"/images/tiles/characters/angel_wingless.png":{"height":288,"width":456,"type":"png"},"/images/tiles/characters/winners_jpa.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/winners_jpb.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/sheet_winnersa.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/sheet_winnersb.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collection1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collection2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collection3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/collectionx.png":{"height":288,"width":456,"type":"png"},"/images/tiles/monsters/snowman.png":{"height":144,"width":76,"type":"png"},"/images/tiles/monsters/Dragold.png":{"height":212,"width":156,"type":"png","v":"2"},"/images/tiles/monsters/blackscorpion.png":{"height":256,"width":176,"type":"png"},"/images/tiles/monsters/coboldProto.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/liger_x.png":{"height":184,"width":150,"type":"png"},"/images/tiles/monsters/frankenstein.png":{"height":144,"width":76,"type":"png"},"/images/tiles/characters/custom1.png":{"height":288,"width":312,"type":"png","v":"11"},"/images/tiles/characters/custom2.png":{"height":288,"width":312,"type":"png","v":"4"},"/images/tiles/characters/custom3.png":{"height":288,"width":312,"type":"png","v":"1"},"/images/tiles/characters/others/jsonX.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/mecha_gnome.png":{"height":144,"width":78,"type":"png"},"/images/tiles/characters/others/ship2.png":{"height":64,"width":201,"type":"png"},"/images/tiles/characters/others/newyear_tree.png":{"height":64,"width":144,"type":"png"},"/images/tiles/characters/bonus1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/military2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/military3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/knights.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara4.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara6.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara7.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/chara8.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/automatron2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc3.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc4.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc5.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/npc6.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/dwarf2.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/tristone_m.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/tristone_f.png":{"height":288,"width":312,"type":"png"},"/images/tiles/characters/mystics.png":{"height":144,"width":312,"type":"png"},"/images/tiles/monsters/creatures1.png":{"height":144,"width":312,"type":"png"},"/images/tiles/monsters/creatures2.png":{"height":424,"width":624,"type":"png"},"/images/tiles/monsters/jrpumpkins.png":{"height":144,"width":155,"type":"png"},"/images/tiles/characters/chara5.png":{"height":288,"width":312,"type":"png"},"/images/tiles/items/chests.png":{"height":288,"width":504,"type":"png","v":"2"},"/images/tiles/characters/animationc.png":{"height":400,"width":564,"type":"png","v":"4"},"/images/tiles/characters/animation1i.png":{"height":400,"width":564,"type":"png"},"/images/tiles/characters/animation2.png":{"height":400,"width":564,"type":"png"},"/images/tiles/characters/animation3.png":{"height":400,"width":564,"type":"png"},"/images/tiles/monsters/elemental.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/monster_dknight1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_dknight2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/fairies.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/monster_bird1.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_bird2.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_bird3.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_boar.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_cacto.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/rudolphi.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_elk.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_golem1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_golem2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_lich.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_lizardman1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_lizardman2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/stompy3.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_minotaur.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_phoenix.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/monster_raptor1.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_raptor2.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/grinch.png":{"height":144,"width":82,"type":"png"},"/images/tiles/monsters/monster_treant.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/monster_wolf1.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/monster_wolf2.png":{"height":264,"width":195,"type":"png"},"/images/tiles/monsters/json.png":{"height":228,"width":183,"type":"png"},"/images/tiles/monsters/custom1.png":{"height":512,"width":720,"type":"png","v":"6"},"/images/tiles/monsters/custom2.png":{"height":512,"width":720,"type":"png","v":"5"},"/images/tiles/monsters/monster1.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/animals1.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/animals2.png":{"height":288,"width":504,"type":"png"},"/images/tiles/monsters/birds1_modded.png":{"height":288,"width":504,"type":"png"},"/images/tiles/monsters/goblinos.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/goblinkingb.png":{"height":212,"width":156,"type":"png"},"/images/tiles/monsters/monsterc6.png":{"height":512,"width":704,"type":"png"},"/images/tiles/monsters/tinyfairies.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/monsterc2.png":{"height":400,"width":564,"type":"png"},"/images/tiles/monsters/robots.png":{"height":288,"width":372,"type":"png"},"/images/tiles/monsters/mage.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/monster2.png":{"height":512,"width":720,"type":"png","v":"3"},"/images/tiles/monsters/monster3c.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/monster4.png":{"height":512,"width":720,"type":"png"},"/images/tiles/monsters/vampire2d.png":{"height":288,"width":312,"type":"png"},"/images/tiles/monsters/mr_pumpkin.png":{"height":144,"width":80,"type":"png"},"/images/tiles/monsters/cbee.png":{"height":144,"width":78,"type":"png"},"/images/tiles/monsters/iceGolem.png":{"height":200,"width":141,"type":"png"},"/images/tiles/monsters/green.png":{"height":144,"width":80,"type":"png"},"/images/sprites/emblems/emblems.png":{"height":96,"width":480,"type":"png","v":"6"},"/images/cosmetics/skins/sskin1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/skins/mskin1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/skins/lskin1.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/sbody1.png":{"height":288,"width":324,"type":"png","v":"4"},"/images/cosmetics/armors/mbody1.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/mbody2.png":{"height":288,"width":324,"type":"png","v":"6"},"/images/cosmetics/armors/mbody3.png":{"height":288,"width":324,"type":"png","v":"3"},"/images/cosmetics/armors/mbody4.png":{"height":288,"width":324,"type":"png","v":"3"},"/images/cosmetics/armors/mbody5.png":{"height":288,"width":324,"type":"png","v":"3"},"/images/cosmetics/armors/mbody6.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/sarmor1.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/sarmor2.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/marmor1.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/marmor2.png":{"height":288,"width":324,"type":"png","v":"3"},"/images/cosmetics/armors/marmor3.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/marmor4.png":{"height":288,"width":324,"type":"png","v":"4"},"/images/cosmetics/armors/marmor5.png":{"height":288,"width":324,"type":"png","v":"4"},"/images/cosmetics/armors/marmor6.png":{"height":288,"width":324,"type":"png","v":"3"},"/images/cosmetics/armors/marmor7.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/marmor8.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/marmor9.png":{"height":288,"width":324,"type":"png","v":"2"},"/images/cosmetics/armors/marmor10.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor11.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/marmor12.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/armors/larmor1.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/lchar1.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/mchar16.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/schar7.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/xschar2.png":{"height":288,"width":324,"type":"png"},"/images/all_characters/xxschar2.png":{"height":288,"width":324,"type":"png"},"/images/cosmetics/hairdo/hairdo1.png":{"height":120,"width":675,"type":"png","v":"7"},"/images/cosmetics/hairdo/hairdo2.png":{"height":120,"width":675,"type":"png","v":"7"},"/images/cosmetics/hairdo/hairdo3.png":{"height":120,"width":675,"type":"png","v":"7"},"/images/cosmetics/hairdo/hairdo4.png":{"height":120,"width":675,"type":"png","v":"7"},"/images/cosmetics/hairdo/hairdo5.png":{"height":120,"width":675,"type":"png","v":"7"},"/images/cosmetics/hairdo/hairdo6.png":{"height":120,"width":675,"type":"png","v":"2"},"/images/cosmetics/hats/hats1.png":{"height":120,"width":675,"type":"png","v":"2"},"/images/cosmetics/hats/hats2.png":{"height":120,"width":675,"type":"png","v":"3"},"/images/cosmetics/hats/hats3.png":{"height":120,"width":675,"type":"png","v":"2"},"/images/cosmetics/hats/hats4.png":{"height":120,"width":675,"type":"png","v":"3"},"/images/cosmetics/wings/wings1.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/wings/wings2.png":{"height":144,"width":128,"type":"png"},"/images/cosmetics/wings/wings3.png":{"height":144,"width":185,"type":"png","v":"2"},"/images/cosmetics/wings/backpacks.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/wings/backpack2.png":{"height":144,"width":185,"type":"png"},"/images/cosmetics/tails/wolftail.png":{"height":144,"width":108,"type":"png"},"/images/cosmetics/tails/wolftail2.png":{"height":144,"width":108,"type":"png"},"/images/cosmetics/tails/wolftail3.png":{"height":144,"width":108,"type":"png"},"/images/cosmetics/makeup/smakeup.png":{"height":120,"width":27,"type":"png"},"/images/cosmetics/makeup/malemakeup.png":{"height":120,"width":351,"type":"png"},"/images/cosmetics/makeup/femalemakeupv2.png":{"height":120,"width":351,"type":"png"},"/images/cosmetics/accessories/eyeglasses.png":{"height":120,"width":1107,"type":"png","v":"3"},"/images/cosmetics/beardo/beard1.png":{"height":120,"width":1107,"type":"png","v":"3"},"/images/cosmetics/beardo/mask1.png":{"height":120,"width":675,"type":"png","v":"2"},"/images/cosmetics/beardo/facemakeup.png":{"height":120,"width":675,"type":"png","v":"2"},"/images/tiles/items/pack_1a.png":{"height":2048,"width":256,"type":"png","v":"11"},"/images/tiles/items/pack_20vt6.png":{"height":1280,"width":320,"type":"png"},"/images/tiles/items/skills_20v5.png":{"height":240,"width":320,"type":"png"},"/images/tiles/items/custom.png":{"height":140,"width":140,"type":"png","v":"7"},"/images/tiles/map/castle.png":{"height":512,"width":544,"type":"png","v":"2"},"/images/tiles/map/custom2.png":{"height":560,"width":752,"type":"png","v":"14"},"/images/tiles/map/custom.png":{"height":480,"width":480,"type":"png","v":"12"},"/images/tiles/map/custom_a.png":{"height":320,"width":320,"type":"png","v":"5"},"/images/tiles/map/doors.png":{"height":256,"width":192,"type":"png"},"/images/tiles/map/dungeon.png":{"height":416,"width":912,"type":"png","v":"5"},"/images/tiles/map/house.png":{"height":1168,"width":1104,"type":"png","v":"4"},"/images/tiles/map/inside.png":{"height":816,"width":832,"type":"png","v":"9"},"/images/tiles/map/outside.png":{"height":832,"width":904,"type":"png","v":"7"},"/images/tiles/map/puzzle.png":{"height":320,"width":336,"type":"png","v":"7"},"/images/tiles/map/water_updated.png":{"height":1200,"width":704,"type":"png","v":"13"},"/images/tiles/map/winter.png":{"height":640,"width":912,"type":"png","v":"5"},"/images/tiles/map/fort.png":{"height":832,"width":656,"type":"png","v":"3"},"/images/tiles/map/beach_v2.png":{"height":416,"width":576,"type":"png"},"/images/tiles/map/world.png":{"height":288,"width":432,"type":"png"},"/images/tiles/items/stands.png":{"height":144,"width":78,"type":"png","v":"6"},"/images/tiles/map/new.png":{"height":480,"width":672,"type":"png","v":"15"},"/images/tiles/map/dark_dimension.png":{"height":336,"width":464,"type":"png","v":"0"},"/images/tiles/map/jungle.png":{"height":336,"width":496,"type":"png","v":"2"},"/images/tiles/map/ship.png":{"height":448,"width":864,"type":"png"},"/images/tiles/map/ashlands.png":{"height":336,"width":640,"type":"png"},"/images/tiles/map/ruins.png":{"height":832,"width":704,"type":"png","v":"2"},"/images/tiles/map/tree.png":{"height":576,"width":544,"type":"png"},"/images/sprites/animations/Block.png":{"height":48,"width":528,"type":"png"},"/images/sprites/animations/ExplodeC.png":{"height":16,"width":192,"type":"png"},"/images/sprites/animations/ExplodeB.png":{"height":16,"width":192,"type":"png"},"/images/sprites/animations/ExplodeP2.png":{"height":16,"width":192,"type":"png"},"/images/sprites/animations/ExplodeUCS.png":{"height":16,"width":192,"type":"png"},"/images/sprites/animations/ExplodeA.png":{"height":16,"width":192,"type":"png"},"/images/sprites/weather/wsheet_rain1_1.png":{"height":32,"width":128,"type":"png"},"/images/sprites/weather/wsheet_snow_1.png":{"height":32,"width":128,"type":"png"},"/images/sprites/weather/fog.png":{"height":100,"width":200,"type":"png"},"/images/tiles/animations/custom/crackle1.png":{"height":25,"width":384,"type":"png"},"/images/sprites/animations/GlintF.png":{"height":16,"width":64,"type":"png"},"/images/sprites/emotions/heart_rise_single.png":{"height":64,"width":640,"type":"png"},"/images/sprites/animations/attack3.png":{"height":16,"width":192,"type":"png"},"/images/sprites/animations/Spark0.png":{"height":80,"width":160,"type":"png"},"/images/sprites/animations/Slash0.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/Slash1.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/Slash3.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/Slash2Quick.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/snowflake.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/snowball_projectile.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/snowball_hit.png":{"height":64,"width":256,"type":"png"},"/images/sprites/animations/pinky.png":{"height":16,"width":48,"type":"png","v":"2"},"/images/sprites/animations/wandy.png":{"height":16,"width":48,"type":"png","v":"2"},"/images/sprites/animations/CArrow.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/garrow.png":{"height":32,"width":80,"type":"png"},"/images/sprites/animations/arrow1.png":{"height":32,"width":80,"type":"png"},"/images/sprites/animations/arrow2.png":{"height":32,"width":80,"type":"png"},"/images/sprites/animations/fireArrow.png":{"height":32,"width":80,"type":"png"},"/images/sprites/animations/pouchArrow.png":{"height":32,"width":80,"type":"png"},"/images/sprites/animations/frostArrow.png":{"height":32,"width":80,"type":"png"},"/images/sprites/animations/terrorAcid.png":{"height":32,"width":128,"type":"png"},"/images/sprites/animations/heartedArrow.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/PBlob.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/MBlob.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/MBlobP.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/MBlobR.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/magic0.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/magic1.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/magic2.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/magic3.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/magic4.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/slash.png":{"height":32,"width":96,"type":"png"},"/images/sprites/animations/wslash.png":{"height":32,"width":96,"type":"png"},"/images/sprites/animations/healAttack.png":{"height":20,"width":80,"type":"png"},"/images/sprites/animations/curseAttack.png":{"height":20,"width":60,"type":"png"},"/images/sprites/animations/fireball.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/frostball.png":{"height":24,"width":80,"type":"png"},"/images/sprites/animations/gold.png":{"height":20,"width":20,"type":"png"},"/images/sprites/animations/Slash0Arrow.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/crackingIce.png":{"height":32,"width":192,"type":"png"},"/images/sprites/animations/Slash0Super.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/partyHeal.png":{"height":64,"width":288,"type":"png"},"/images/sprites/animations/curse.png":{"height":64,"width":192,"type":"png"},"/images/sprites/animations/Teleport2.png":{"height":48,"width":144,"type":"png"},"/images/sprites/animations/typingAnim.png":{"height":16,"width":64,"type":"png"},"/images/sprites/animations/Teleport1P.png":{"height":48,"width":576,"type":"png"},"/images/sprites/animations/TeleportInv.png":{"height":48,"width":144,"type":"png"},"/images/sprites/animations/Shield1.png":{"height":16,"width":144,"type":"png"},"/images/sprites/animations/Shield_Invincible.png":{"height":16,"width":144,"type":"png"},"/images/sprites/animations/warrior_shield.png":{"height":16,"width":144,"type":"png"},"/images/sprites/animations/reflection.png":{"height":16,"width":144,"type":"png"},"/images/sprites/animations/burst.png":{"height":24,"width":8,"type":"png"},"/images/sprites/animations/lightningBurst3.png":{"height":300,"width":32,"type":"png"},"/images/sprites/animations/Light.png":{"height":80,"width":176,"type":"png"},"/images/sprites/animations/CGreen_Spark0.png":{"height":80,"width":160,"type":"png"},"/images/sprites/animations/CRed_Spark0.png":{"height":80,"width":160,"type":"png"},"/images/sprites/animations/CGreen_Spark3.png":{"height":80,"width":160,"type":"png"},"/images/sprites/animations/CRed_Spark5.png":{"height":80,"width":160,"type":"png"},"/images/sprites/animations/CPurple_Spark.png":{"height":80,"width":160,"type":"png"},"/images/sprites/animations/Consume0.png":{"height":48,"width":208,"type":"png"},"/images/sprites/animations/gold_anim.png":{"height":48,"width":208,"type":"png"},"/images/sprites/animations/PuffR.png":{"height":16,"width":224,"type":"png"},"/images/sprites/animations/ConsumeR.png":{"height":48,"width":208,"type":"png"},"/images/sprites/animations/Consume2.png":{"height":48,"width":208,"type":"png"},"/images/sprites/animations/ConsumeP.png":{"height":48,"width":208,"type":"png"},"/images/sprites/animations/Puff.png":{"height":16,"width":112,"type":"png"},"/images/sprites/animations/Electric.png":{"height":16,"width":96,"type":"png"},"/images/sprites/animations/Tangle.png":{"height":28,"width":96,"type":"png"},"/images/sprites/animations/Dampen.png":{"height":28,"width":96,"type":"png"},"/images/sprites/animations/Poison.png":{"height":32,"width":128,"type":"png"},"/images/sprites/animations/NuclearA1.png":{"height":48,"width":288,"type":"png"},"/images/sprites/animations/Sick.png":{"height":16,"width":64,"type":"png"},"/images/sprites/animations/BloodSplatter0.png":{"height":32,"width":288,"type":"png"},"/images/sprites/animations/BloodSplatter3.png":{"height":32,"width":224,"type":"png"},"/images/sprites/animations/confetti2.png":{"height":24,"width":288,"type":"png"},"/sounds/loops/empty_loop_for_js_performance.ogg":{},"/sounds/loops/christmas.ogg":{},"/sounds/loops/horror_01_loop.ogg":{},"/sounds/loops/horror_02_loop.ogg":{},"/sounds/loops/casual_05_loop.ogg":{},"/sounds/loops/rpg_07_loop.ogg":{},"/sounds/loops/rpg_08_loop.ogg":{},"/sounds/loops/rpg_10_loop.ogg":{},"/sounds/loops/rpg_14_loop.ogg":{},"/sounds/loops/rpg_16_loop.ogg":{},"/sounds/effects/click_natural.wav":{},"/sounds/fx/EXPLOSION_Short_Kickback_Crackle_stereo.wav":{},"/sounds/fx/pop_plink.wav":{},"/sounds/fx/ANIMAL_Duck_08_mono.wav":{},"/sounds/fx/8BIT_RETRO_Hit_Bump_Noise_mono.wav":{},"/sounds/fx/zap_drum.wav":{},"/sounds/fx/8BIT_RETRO_Fire_Blaster_Short_mono.wav":{},"/sounds/fx/VideoGameSFX_blip_07.wav":{},"/sounds/fx/UI_Beep_Double_Quick_Smooth_stereo.wav":{},"/sounds/fx/FOOTSTEP_Asphalt_Trainers_Walk_Slow_RR5_mono.wav":{},"/sounds/fx/DROP_Designed_mono.wav":{},"/sounds/fx/CLASP_Plastic_Open_stereo.wav":{},"/sounds/fx/WHOOSH_Air_Fast_Wind_RR1_mono.wav":{},"/sounds/fx/MAGIC_SPELL_Spawn_mono.wav":{},"/sounds/fx/Explosive01.wav":{},"/sounds/fx/Explosive02.wav":{},"/sounds/fx/MUSIC_EFFECT_Bell_Voice_Positive_09_stereo.wav":{},"/sounds/loops/empty_loop_for_js_performance.wav":{}} diff --git a/electron/package-lock.json b/electron/package-lock.json new file mode 100644 index 0000000..0dccc6b --- /dev/null +++ b/electron/package-lock.json @@ -0,0 +1,185 @@ +{ + "name": "adventure-land", + "version": "1.3.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "conf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-2.2.0.tgz", + "integrity": "sha512-93Kz74FOMo6aWRVpAZsonOdl2I57jKtHrNmxhumehFQw4X8Sk37SohNY11PG7Q8Okta+UnrVaI006WLeyp8/XA==", + "requires": { + "dot-prop": "^4.1.0", + "env-paths": "^1.0.0", + "make-dir": "^1.0.0", + "pkg-up": "^2.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "electron-store": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-2.0.0.tgz", + "integrity": "sha512-1WCFYHsYvZBqDsoaS0Relnz0rd81ZkBAI0Fgx7Nq2UWU77rSNs1qxm4S6uH7TCZ0bV3LQpJFk7id/is/ZgoOPA==", + "requires": { + "conf": "^2.0.0" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } +} diff --git a/electron/package.json b/electron/package.json new file mode 100644 index 0000000..301f7c5 --- /dev/null +++ b/electron/package.json @@ -0,0 +1,13 @@ +{ + "productName": "Adventure Land", + "name": "adventure-land", + "version": "1.3.1", + "license": "AdventureLandOnlyUse", + "main": "main.js", + "dependencies": { + "electron-store": "^2.0.0", + "fs-extra": "^7.0.1", + "path": "^0.12.7" + }, + "devDependencies": {} +} diff --git a/electron/resources/.DS_Store b/electron/resources/.DS_Store new file mode 100644 index 0000000..0bf0248 Binary files /dev/null and b/electron/resources/.DS_Store differ diff --git a/electron/resources/loader.html b/electron/resources/loader.html new file mode 100644 index 0000000..9330ab0 --- /dev/null +++ b/electron/resources/loader.html @@ -0,0 +1,69 @@ + + + + + + +|
+ LOADING 0% |
+
|
+ LOADING 0%
+ Pre-processing assets for Windows 7/8. This step can take up to 2 minutes. If the game doesn't load: You can always email hello@adventure.land
+
+ Ps. Adventure Land requires an internet connection. Make sure you are connected!
+ |
+
|
+ LOADING 0% |
+
{% include "stack/update_notes.txt" %}
+
\ No newline at end of file
diff --git a/htmls/base.html b/htmls/base.html
new file mode 100644
index 0000000..9c90635
--- /dev/null
+++ b/htmls/base.html
@@ -0,0 +1,61 @@
+
+
+
+ | + {%include "htmls/contents/character.html" %} + |
|
+
+ {% if purpose == "halloween" %}
+
+
+ Hi Adventurer! +Wizard here, I develop the game, since the game launched, with your feedback, I've added Partying, Trade, Merchanting, PVP, The Bank, Item Abilities, Class Abilities, New Classes: Priest, Rogue, Ranger, and a lot more that I can't remember right now, so basically, the core dynamics of the game improved significantly. + +Oragon in game, and Jayson in real life, joined the team to build new maps and improve the content of the game, he has been progressing really well, the new TOWN has been ready for weeks, but we are waiting a bit to re-launch the game with new content, anyway, enough talking. + +Onto the subject of this email, the HALLOWEEN ZONE!!! + +Check it out, it has some new halloween themed monsters, unique drops that will become really valuable after the zone closes down, and you can get a lot of candy drops from monsters that you can EXCHANGE for a random reward! + +Anyway, while we work on the game, spend these couple of weeks in the Halloween zone, in November, I'm guessing the new content should be ready. I know you all want more adventure, I will do my best to give you more excitement. + +
+ Yours sincerely, Hi Adventurer! +What's new? We have a new map called Spooky Town, The crafting system has been brewing for some time, make sure to farm some Hawk's ;) Many of the promised and non-launched features will launch before Xmas. + +Be really careful in Spooky Town, unlike our earlier maps and content, Spooky Town can be very hostile! + +Our Halloween inspired event starts today and It will last 3 weeks! + +Note: You can now play with 2 characters in normal servers and one character in a PVP server freely, going to renovate/ease the dynamics even further soon + +
+ Yours sincerely, Hi Adventurer! + +The new zone Winterland and the Xmas event is live! Xmas drops are global and you can exchange them in Winterland! This update brings quests, the first orb, actual capes and the first elixir, Eggnog! It's another exciting time for the game. + +Additionally, Adventure Land is on Steam Greenlight! Would really appreciate your help: http://steamcommunity.com/sharedfiles/filedetails/?id=821265543 + +
+ Happy New Year, + Ps 2. Join us on Discord if you haven't already :] + {% elif purpose == "xmas2" %} + Hi Adventurer! + +Our Xmas event is live! Xmas drops are global and you can exchange them in Winterland + +There are various new Xmas themed items, Ornament Staff, Candy Cane Sword, Angel Wings to name a few. + +Make sure to visit our Xmas Tree outside the Bank to receive your Xmas buff! + +We would love to see you among us, + +
+ Happy New Year, + Ps 2. We're releasing on Steam before Xmas! + Ps 3. Here's a CODE that automates the Xmas buff + Ps 4. There are some new stuff and new skills too! + + + {% elif purpose == "xmas3" %} + Hi Adventurer! + +Our Holiday Season event is live! Holiday Season drops are global and you can exchange them in Winterland + +If you haven't visited the game in a long time, a lot has changed, but the game is still the same! You can learn more about the event, Grinch, the Festive achievement, new items from the event information section in the top right corner. + +Make sure to visit our Holiday Tree outside the Bank to receive your buff! + +We would love to see you among us, + +
+ Happy New Year, Turn Emails ON/OFF (You have to login to make changes for the time being) + {% elif purpose == "cvalentines" %} +Hi Adventurer! + +Red Envelope's are global drops, they drop a new kind of item, the Dragon Armor. + +The Love Goo is back too for the Valentine's Day. + +
+ Wish you wealth and prosperity, Hi Adventurer! +Our Easter Event is live! Chase the Wabbit, hunt eggs, craft them into a basket, get lucky with the golden egg, exchange them for rewards. It's an exciting time on Adventure Land! + +Additionally, many players requested access to game's map editor, I decided to add a place called the "Resort" to the game, where players create their own maps for other players to visit, while the Resort is still in development, the public map editor is live! Here's your link: http://adventure.land/map/{{user.k()}}_1 + +
+ Yours sincerely, + Ps 2. Just reply to this email if you have any questions + + + {% elif purpose == "easter2" %} + Hi Adventurer! + +Our Easter Event is live! Chase the Wabbit, hunt eggs, craft them into a basket, get lucky with the golden egg, exchange them for rewards. It's an exciting time on Adventure Land! + +Defeating the Wabbit grants you +100% Luck for 24 hours. There's a new Easter themed set too! + +
+ Yours sincerely, Hi Adventurer! +Our Anniversary Event is live! It's a good time to continue playing Adventure Land. Our Anniversary Gifts are global drops. You can start opening (exchanging) the gifts nearing the end of the event. + +As another suggestion, Farm Ice Roamer's, Big Pom Pom's, or Arctic Bee's for "Essence of Frost"'s. It's our first crafting material, pretty soon you will be able to craft new weapons with it. As another thing to look forward to, pretty soon, we are going to launch underground tunnels that will house new monsters/bosses with new drops, these tunnels will connect all of Adventure Land together! + +
+ Yours sincerely, Hi Adventurer! +What's new? We have a new boss called Franky in Mansion - a cooperative boss, no one has defeated him yet! + +There are a lot of small, recent changes, for example a new party system with individual party shares. Phoenix, Mr. Pumpkin, Mr. Green are now cooperative bosses too. So everyone can contribute to taking them down, and get a decent drop! + +We're also getting close to a Steam release. + +
+ Happy Halloween! |
+
First of all, I want to thank all the players who played the game, provided feedback, endured, shared the joyous moments, kept pushing the game in the right direction.
+I want to thank /r/mmorpg for being an open platform for mmorpg enthusiasts, I posted on /r/mmorpg at the end of 2016, and I've been improving and shaping the game with the small early adopter userbase ever since.
+I want to thank Mark Jayson Lacandula, aka Json, I started working on the game in June 2016, launched very early around August 2016, he was one of the very first players who tried the game after seeing my tiny Adsense Ad. I didn't take him too seriously when he wanted to try my in-house map editor, but shared it with him anyway. After a very short time, he shared the first map he made, at that moment I knew I discovered a rare natural talent. He made all our maps, learned pixel art, extended our tilesets and sprites and kept exploring, he was and is always there, through the good times and the bad times. Game development is no easy task, contrary to popular belief, it's not rewarding, you rarely reap the benefits, up to this point, we didn't reap, but he never quit - so thank you Json. I hope after Adventure Land, you keep on working in the game industry. (Reader: If you are a talent hunter, do reach out to him)
+I want to thank Ellian, our freelance pixel artist, for being the most professional freelancer I've ever worked with. No one is more reliable than you. Adventure Land started with an off-the-shelf 16x16 icon pack, with Ellian, we created a custom 20x20 iconset, with the community we dreamed, Ellian made. Workload-wise, Adventure Land is a small-fish, but through 2 years, he was always there at a moment's notice. To extend our iconset 5-6 items at a time :) If I could do it all over again, maybe for Adventure Land 2, I'd love to create all the tilesets and sprites from scratch with Ellian.
+I want to thank all the developers, artists, composers, whose libraries, assets and work I used in Adventure Land.
+And thank you for reading, and hopefully for playing Adventure Land :)
+[10/12/18]
+I want to also thank Steam for being such an awesome platform, 1+ years now, it has been driving new players in, no advertisements or marketing.
+Another thanks to Google Cloud for providing us startup credits, it really eased my financial burdens during this development stage.
+[06/03/20]
\ No newline at end of file diff --git a/htmls/contents/guide.html b/htmls/contents/guide.html new file mode 100644 index 0000000..986325e --- /dev/null +++ b/htmls/contents/guide.html @@ -0,0 +1,102 @@ + \ No newline at end of file diff --git a/htmls/contents/hardcore_guide.html b/htmls/contents/hardcore_guide.html new file mode 100644 index 0000000..b3004ce --- /dev/null +++ b/htmls/contents/hardcore_guide.html @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/htmls/contents/keymap_guide.html b/htmls/contents/keymap_guide.html new file mode 100644 index 0000000..4913a83 --- /dev/null +++ b/htmls/contents/keymap_guide.html @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/htmls/contents/login.html b/htmls/contents/login.html new file mode 100644 index 0000000..1834818 --- /dev/null +++ b/htmls/contents/login.html @@ -0,0 +1,155 @@ +|
+ > New Password
+
+ > Repeat New Password
+
+
+
+ |
This privacy policy explains how your data is used and stored by Adventure Land
+ +Adventure Land uses Cookies for authentication and settings, cookies are stored between HTTP and HTTPS
+ +Due to popular demand, and technical challenges, game can be played over both HTTP and HTTPS, over HTTP, if you are on a compromised network, your data will be exposed. If you are playing the game from Steam or Mac App Store, the game uses HTTPS by default
+ +Adventure Land uses Google Analytics for statistics
+ +Adventure Land uses Cloudflare for security and filtering, almost all HTTP/S data goes through Cloudflare, so they potentially access every data you provide
+ +Adventure Land uses your location data to determine which game server is broadly closer to you
+ +Adventure Land stores your encrypted password, characters, character names, data you provide, your IP (used extensively for the character limits logic), character actions and there are various logs and backups of these data, there's currently no system to delete these logs and backups, but as cloud storage is extremely expensive, I personally want to start deleting them in the future, but couldn't find the time yet
+ +Adventure Land doesn't have a reliable way to send emails, so it's a players responsibility to keep themselves up-to-date on this privacy policy, but the main theme will never change, Adventure Land is a game with no intention of misusing a players data
+ +I'm an indie developer doing my best to protect my players and meet their needs, but we live in a chaotic world, If you are a regular player reading this, please be careful, while I do everything to protect you and your data (especially more after everything I've experienced since I launched the game, which made me grow more as a developer and a human, at least I hope), nothing is safe on the Internet, always approach things with this fact in mind
+ +For any questions: hello@adventure.land
+ +Last Edit [04/12/18]
\ No newline at end of file diff --git a/htmls/contents/section_buttons.html b/htmls/contents/section_buttons.html new file mode 100644 index 0000000..304c88f --- /dev/null +++ b/htmls/contents/section_buttons.html @@ -0,0 +1,35 @@ + +{% if buttons=="essentials" %} + Docs + Discord! +{% endif %} +{% if buttons=="musts" %} + {# + #} + +{% endif %} + +{% if buttons=="social" %} + Github + Reddit +{% endif %} +{% if 0 %} + Facebook + Twitter +{% endif %} +{% if buttons=="music" %} + {% if servers %} + + + {# + + + + + #} + {% else %} + Reload + {% endif %} +{% endif %} \ No newline at end of file diff --git a/htmls/contents/selection.html b/htmls/contents/selection.html new file mode 100644 index 0000000..0769017 --- /dev/null +++ b/htmls/contents/selection.html @@ -0,0 +1,254 @@ +
";
+ else if(item.type=="tarot") html+="
";
+ color="#E4E4E4"; // previously gray [16/08/16]
+ if(item.grade=="mid") color="blue"; // lol - must be old [13/04/20]
+ if(actual && actual.p && G.titles[actual.p]) item_name=G.titles[actual.p].title+" "+item_name;
+ else if(actual && actual.p) item_name=actual.p.toTitleCase()+" "+item_name;
+ if(prop.level)
+ {
+ if(item.upgrade && prop.level==12) item_name+=" +Z";
+ else if(item.upgrade && prop.level==11) item_name+=" +Y";
+ else if(item.upgrade && prop.level==10) item_name+=" +X";
+ else if(item.compound && prop.level==7) item_name+=" +R";
+ else if(item.compound && prop.level==6) item_name+=" +S";
+ else if(item.compound && prop.level==5) item_name+=" +V";
+ else item_name+=" +"+prop.level;
+ }
+ if(args.thumbnail)
+ {
+ html+="| Name | Level | Class | Age | Status | Actions |
|---|---|---|---|---|---|
| "+player.name+" | "+player.level+" | "+player.ctype.toUpperCase()+" | "+player.age+" | "+afk+" | "+actions+" |
| Name | Level | Class | Status | Server | "+player.name+" | "+player.level+" | "+player.type.toUpperCase()+" | "+afk+" | "+player.server+" | "; + }); + html+="
|---|
| Name | Level | Class | Age | Status | Party | "; + if(is_pvp) html+="Kills | "; + html+="
|---|---|---|---|---|---|---|
| "+name+" | "+player.level+" | "+player.type.toUpperCase()+" | "+player.age+" | "+afk+" | "+party+" | "; + if(is_pvp) html+=""+to_pretty_num(player.kills)+" | "; + html+="
| Name | # | Action | "; + html+="
|---|---|---|
| All Merchants | N | Show |
| "+server_regions[server.region]+" "+server.name+" | "+server.players+" | "+action+" |
| Name | Level | Class | Status | Deploy | "; + html+="
|---|---|---|---|---|
| "+name+" | "+player.level+" | "+player.type.toUpperCase()+" | "+afk+" | "; + html+=""+link+" | "; + html+="
";
+ else if(item.type=="tarot") html+="
";
+ color="#E4E4E4"; // previously gray [16/08/16]
+ if(item.grade=="mid") color="blue"; // lol - must be old [13/04/20]
+ if(actual && actual.p && G.titles[actual.p]) item_name=G.titles[actual.p].title+" "+item_name;
+ else if(actual && actual.p) item_name=actual.p.toTitleCase()+" "+item_name;
+ if(prop.level)
+ {
+ if(item.upgrade && prop.level==12) item_name+=" +Z";
+ else if(item.upgrade && prop.level==11) item_name+=" +Y";
+ else if(item.upgrade && prop.level==10) item_name+=" +X";
+ else if(item.compound && prop.level==7) item_name+=" +R";
+ else if(item.compound && prop.level==6) item_name+=" +S";
+ else if(item.compound && prop.level==5) item_name+=" +V";
+ else item_name+=" +"+prop.level;
+ }
+ if(args.thumbnail)
+ {
+ html+="