Skip to content

Commit

Permalink
Scripting headers: add material-related constants, minor lib extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
phobos2077 committed Jul 17, 2024
1 parent 3d1de2c commit 87202bb
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 56 deletions.
16 changes: 16 additions & 0 deletions artifacts/scripting/headers/define_extra.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,22 @@
#define PROTO_CR_AI_PACKET (408)
#define PROTO_CR_TEAM_NUM (412)

// scenery
#define PROTO_SC_MATERIAL (44)

// walls
#define PROTO_WL_MATERIAL (32)

// material types
#define MATERIAL_TYPE_GLASS (0)
#define MATERIAL_TYPE_METAL (1)
#define MATERIAL_TYPE_PLASTIC (2)
#define MATERIAL_TYPE_WOOD (3)
#define MATERIAL_TYPE_DIRT (4)
#define MATERIAL_TYPE_STONE (5)
#define MATERIAL_TYPE_CEMENT (6)
#define MATERIAL_TYPE_LEATHER (7)

// weapon calibers
#define CALIBER_NONE (0)
#define CALIBER_ROCKET (1)
Expand Down
16 changes: 12 additions & 4 deletions artifacts/scripting/headers/lib.arrays.h
Original file line number Diff line number Diff line change
Expand Up @@ -554,14 +554,14 @@ procedure array_transform_kv(variable arr, variable keyFunc, variable valueFunc)
end

/**
* Converts given array into a new map where keys are array values and all values are 1.
* Converts given array into a new map where keys are array values and all values are set to specified value.
* @arg {array} arr
* @ret {array}
*/
procedure array_to_set(variable arr) begin
procedure array_to_set(variable arr, variable value := 1) begin
variable v, retArr := temp_array_map;
foreach (v in arr) begin
retArr[v] := 1;
retArr[v] := value;
end
return retArr;
end
Expand Down Expand Up @@ -641,7 +641,7 @@ procedure array_fill(variable arr, variable pos, variable count, variable value)
end

/**
* Adds all the values of the second array to the first array.
* Adds all the values of the second array to the first array. If arr1 is a map then for values with same keys, values from arr2 will take priority.
* @arg {array} arr1
* @arg {array} arr2
* @ret {array} - the first array after modification
Expand All @@ -661,6 +661,14 @@ procedure array_append(variable arr1, variable arr2) begin
return arr1;
end

/**
* Creates a new temp array with all values from arr1 and arr2. If arr1 is a map then for values with same keys, values from arr2 will take priority.
* @arg {array} arr1
* @arg {array} arr2
* @ret {array} - the created temp array
*/
#define array_concat(arr1, arr2) array_append(clone_array(arr1), arr2)

/**
* Loads a "saved" array. If it doesn't exist, creates it (with a given size).
* @arg {string} name - saved array name/key
Expand Down
72 changes: 20 additions & 52 deletions artifacts/scripting/headers/lib.inven.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,21 @@ procedure unwield_armor(variable critter) begin
end
end

/**
* Makes critter put away given item if it's in armor or any item/weapon slot.
* @arg {ObjectPtr} critter
* @arg {ObjectPtr} item
*/
procedure inven_unwield_item(variable critter, variable item) begin
if (obj_type(critter) != OBJ_TYPE_CRITTER) then return;

if (critter_inven_obj(critter, INVEN_TYPE_WORN) == item) then begin
call unwield_armor(critter);
end else if ((critter_inven_obj(critter, INVEN_TYPE_LEFT_HAND) == item) or (critter_inven_obj(critter, INVEN_TYPE_RIGHT_HAND) == item)) then begin
inven_unwield(critter);
end
end

/**
* Removes items of given pid from given object's inventory. Returns number of actually removed items.
* @arg {ObjectPtr} invenObj - obj to remove items from
Expand All @@ -86,33 +101,22 @@ procedure remove_items_pid(variable invenObj, variable itemPid, variable quantit
toRemoveQty := quantity;
while (quantity > 0) do begin
item := obj_carrying_pid_obj(invenObj, itemPid);
if (obj_type(invenObj) == OBJ_TYPE_CRITTER) then begin
if (critter_inven_obj(invenObj, INVEN_TYPE_WORN) == item) then begin
call unwield_armor(invenObj);
end else if ((critter_inven_obj(invenObj, INVEN_TYPE_LEFT_HAND) == item) or (critter_inven_obj(invenObj, INVEN_TYPE_RIGHT_HAND) == item)) then begin
inven_unwield(invenObj);
end
end
call inven_unwield_item(invenObj, item);
quantity -= rm_mult_objs_from_inven(invenObj, item, quantity);
destroy_object(item);
end
return toRemoveQty;
end

/**
* Remove the whole stack of a given *item* object from *invenObj* inventory.
* Remove one item from a given *item* stack object from *invenObj* inventory.
* For a critter, this will correctly remove item from armor/hand slot, if it is equipped.
* Note that *item* pointer will be invalid after this.
* @arg {ObjectPtr} invenObj - obj to remove from
* @arg {ObjectPtr} item - item (stack) object to remove
*/
procedure remove_item_obj(variable invenObj, variable item) begin
if (obj_type(invenObj) == OBJ_TYPE_CRITTER) then begin
if (critter_inven_obj(invenObj,INVEN_TYPE_WORN) == item) then begin
call unwield_armor(invenObj);
end else if ((critter_inven_obj(invenObj, INVEN_TYPE_LEFT_HAND) == item) or (critter_inven_obj(invenObj, INVEN_TYPE_RIGHT_HAND) == item)) then begin
inven_unwield(invenObj);
end
end
call inven_unwield_item(invenObj, item);
rm_obj_from_inven(invenObj, item);
destroy_object(item);
end
Expand All @@ -136,7 +140,7 @@ end
/**
* Ensures a given *quantity* of *itemPid* in *invenObj* inventory, adding or removing items as necessary.
* @arg {ObjectPtr} invenObj - obj to add/remove items to/from
* @arg {int} itemPid - PID of item to remove
* @arg {int} itemPid - PID of item to add/remove
* @arg {int} quantity
*/
procedure set_items_qty_pid(variable invenObj, variable itemPid, variable quantity)
Expand All @@ -154,42 +158,6 @@ begin
end
end

/**
* Removes money and items from a *critter*'s inventory, using provided probabilities (applied to whole stacks, not individual items).
* Useful for reducing loot of merchants after death.
* @arg {ObjectPtr} critter
* @arg {int} moneyPercent - Percent of money to remove.
* @arg {int} probArmor - % probability to remove armor.
* @arg {int} probDrugs - % probability to remove drugs.
* @arg {int} probWeapons - % probability to remove weapons.
* @arg {int} probAmmo - % probability to remove ammo.
* @arg {int} probMisc - % probability to remove misc item.
*/
procedure reduce_merchant_loot(variable critter, variable moneyPercent, variable probArmor, variable probDrugs, variable probWeapons, variable probAmmo, variable probMisc) begin
variable inv, item, it, prob, tmp;
inv := inven_as_array(critter);
item_caps_adjust(critter, -(item_caps_total(critter) * moneyPercent / 100));
//display_msg("total items "+len_array(inv));
foreach item in inv begin
if (obj_pid(item) != PID_BOTTLE_CAPS) then begin
it := obj_item_subtype(item);
if (it == item_type_armor) then
prob := probArmor;
else if (it == item_type_drug) then
prob := probDrugs;
else if (it == item_type_weapon) then
prob := probWeapons;
else if (it == item_type_ammo) then
prob := probAmmo;
else
prob := probMisc;
if (random(0, 99) < prob) then begin
//display_msg("remove "+obj_name(item));
call remove_all_items_pid(critter, obj_pid(item));
end
end
end
end

/**
* Returns item in one of *critter*'s hand slots using given attack type.
Expand Down

0 comments on commit 87202bb

Please sign in to comment.