Merge pull request #70 from FreezePhoenix/patch-5

Implement equip_batch
This commit is contained in:
Kaan Soral
2024-01-25 00:54:03 +03:00
committed by GitHub
4 changed files with 143 additions and 3 deletions
+3 -1
View File
@@ -63,6 +63,7 @@ docs={
"sell", "sell",
"consume", "consume",
"equip", "equip",
"equip_batch",
"unequip", "unequip",
"lock_item", "lock_item",
"seal_item", "seal_item",
@@ -160,6 +161,7 @@ docs={
"is_array", "is_array",
], ],
"documented":[ "documented":[
"equip_batch",
"attack", "attack",
"heal", "heal",
"buy", "buy",
@@ -338,4 +340,4 @@ docs={
} }
} }
docs["functions"].sort() docs["functions"].sort()
+47
View File
@@ -0,0 +1,47 @@
<p>
Arguments:
<div>&nbsp;<b>*</b> Array - An array of equip definitions</div>
</p>
<p>
Returns:
<div>&nbsp; <b>*</b> Promise</div>
</p>
<p>Example usages:</p>
<div class='code'>
equip_batch([{ num: 0, slot: "chest" }, { num: 1, slot: "orb" }]);
equip_batch([{ num: 0, slot: "chest" }, { num: 1, slot: "orb" }]).then(
function(data){
game_log("Yes!"); // Not all items may have been equipped. All this means is that you send the correct layout of data.
},
function(data) {
game_log("equip_batch failed: " + data.reason);
},
);
</div>
<p>Promise Reference:</p>
<span class='dlabel'>"resolve"</span>
<div class='code'>
{
place: "equip_batch",
response: "data",
slots: [{ num: 0, slot: "chest" }, "no_item"] // Note that even though equipping the orb failed, we still received a success response.
}
</div>
<div style='margin-bottom: 10px'></div>
<span class='dlabel'>"reject"</span>
<div class='code'>
{
place: "equip_batch",
failed: true,
response: "invalid",
reason: "invalid", // You didn't send an array.
}
</div>
<p></p>
<span class='redlabel'>"source"</span>
+21 -1
View File
@@ -550,6 +550,26 @@ function consume(num) // consumes or uses an inventory item
return parent.push_deferred("equip"); return parent.push_deferred("equip");
} }
function equip_batch(data) {
if (!Array.isArray(data)) {
game_log("Can't equip_batch non-array");
return rejecting_promise({reason:"invalid"});
}
if (data.length > 15) {
game_log("Can't equip_batch more than 15 items");
return rejecting_promise({reason:"invalid"});
}
for (let i = 0; i < data.length; i++) {
let num = data[i].num;
if (num < 0) {
game_log("Can't equip "+num);
return rejecting_promise({reason:"invalid"});
}
}
parent.socket.emit("equip_batch", data);
return parent.push_deferred("equip_batch");
}
function equip(num,slot) // slot is optional function equip(num,slot) // slot is optional
{ {
if(num<0) if(num<0)
@@ -1981,4 +2001,4 @@ if(parent.is_cli)
if(parent.ls_emulation) window._localStorage=parent.ls_emulation; if(parent.ls_emulation) window._localStorage=parent.ls_emulation;
window.cli_require=parent.cli_require; window.cli_require=parent.cli_require;
} }
code_draw(); code_draw();
+72 -1
View File
@@ -4092,7 +4092,13 @@ function init_io() {
} else { } else {
climit = round(climit / 4); climit = round(climit / 4);
} }
if (method == "cm") { if (method == "equip_batch") {
var cost = 1;
if (Array.isArray(data)) {
cost += data.length / 2;
}
add_call_cost(CC.equip * cost);
} else if (method == "cm") {
var add = 1; var add = 1;
var len = JSON.stringify(data.message).length; var len = JSON.stringify(data.message).length;
var mult = 1; var mult = 1;
@@ -6364,6 +6370,71 @@ function init_io() {
return socket.emit("game_response", { response: "exception", place: "upgrade", failed: true }); return socket.emit("game_response", { response: "exception", place: "upgrade", failed: true });
} }
}); });
socket.on("equip_batch", function (data) {
let player = players[socket.id];
if (!player) {
return;
}
player.c = {};
if (Array.isArray(data)) {
data.length = min(data.length, 15);
let resolve = [];
let penalty = 0;
for (let i = 0; i < data.length; i++) {
let equip_def = data[i];
equip_def.num = to_number(equip_def.num);
if (equip_def.num >= player.items.length) {
resolve.push("invalid");
break;
}
var item = player.items[equip_def.num];
if (!item) {
resolve.push("no_item");
break;
}
if (item.b) {
resolve.push("item_blocked");
break;
}
if (item.name == "placeholder") {
resolve.push("item_placeholder");
break;
}
var def = G.items[item.name];
def.iname = item.name; //just for orb name checks [08/10/16]
if (!def) {
resolve.push("no_item");
break;
}
var slot = equip_def.slot || def.type;
var comp = can_equip_item(player, def, slot);
if (comp == "no") {
resolve.push("cant_equip");
break;
}
slot = comp;
var existing = player.slots[slot];
player.slots[slot] = player.items[equip_def.num];
player.cslots[slot] = cache_item(player.slots[slot]);
if (existing && existing.b) {
existing = null;
}
player.items[equip_def.num] = existing;
player.citems[equip_def.num] = cache_item(existing);
penalty += 120;
resolve.push({ num: equip_def.num, slot });
}
if ("penalty_cd" in player.s) {
player.s.penalty_cd.ms = min(player.s.penalty_cd.ms + penalty, 120000);
} else {
player.s.penalty_cd = { ms: penalty };
}
resend(player, "reopen+u+cid");
success_response("data", { slots: resolve });
} else {
return fail_response("invalid");
}
});
socket.on("equip", function (data) { socket.on("equip", function (data) {
var player = players[socket.id]; var player = players[socket.id];
if (!player) { if (!player) {