Merge pull request #2956 from Citadel-Station-13/upstream-merge-30942

[MIRROR] Adds installing cells as part of mech construction and fixes some mech construction bugs.
This commit is contained in:
LetterJay
2017-09-27 23:45:50 -04:00
committed by GitHub
5 changed files with 639 additions and 448 deletions
+111 -103
View File
@@ -1,103 +1,111 @@
#define FORWARD -1
#define BACKWARD 1
/datum/construction
var/list/steps
var/atom/holder
var/result
var/list/steps_desc
/datum/construction/New(atom)
..()
holder = atom
if(!holder) //don't want this without a holder
qdel(src)
set_desc(steps.len)
return
/datum/construction/proc/next_step()
steps.len--
if(!steps.len)
spawn_result()
else
set_desc(steps.len)
return
/datum/construction/proc/action(atom/used_atom,mob/user)
return
/datum/construction/proc/check_step(atom/used_atom,mob/user) //check last step only
var/valid_step = is_right_key(used_atom)
if(valid_step)
if(custom_action(valid_step, used_atom, user))
next_step()
return 1
return 0
/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type.
var/list/L = steps[steps.len]
if(istype(used_atom, L["key"]))
return steps.len
return 0
/datum/construction/proc/custom_action(step, used_atom, user)
return 1
/datum/construction/proc/check_all_steps(atom/used_atom,mob/user) //check all steps, remove matching one.
for(var/i=1;i<=steps.len;i++)
var/list/L = steps[i];
if(istype(used_atom, L["key"]))
if(custom_action(i, used_atom, user))
steps[i]=null;//stupid byond list from list removal...
listclearnulls(steps);
if(!steps.len)
spawn_result()
return 1
return 0
/datum/construction/proc/spawn_result()
if(result)
new result(get_turf(holder))
qdel(holder)
return
/datum/construction/proc/set_desc(index as num)
var/list/step = steps[index]
holder.desc = step["desc"]
return
/datum/construction/reversible
var/index
/datum/construction/reversible/New(atom)
..()
index = steps.len
return
/datum/construction/reversible/proc/update_index(diff as num)
index+=diff
if(index==0)
spawn_result()
else
set_desc(index)
return
/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step
var/list/L = steps[index]
if(istype(used_atom, L["key"]))
return FORWARD //to the first step -> forward
else if(L["backkey"] && istype(used_atom, L["backkey"]))
return BACKWARD //to the last step -> backwards
return 0
/datum/construction/reversible/check_step(atom/used_atom,mob/user)
var/diff = is_right_key(used_atom)
if(diff)
if(custom_action(index, diff, used_atom, user))
update_index(diff)
return 1
return 0
/datum/construction/reversible/custom_action(index, diff, used_atom, user)
return 1
#define FORWARD -1
#define BACKWARD 1
/datum/construction
var/list/steps
var/atom/holder
var/result
var/list/steps_desc
/datum/construction/New(atom)
..()
holder = atom
if(!holder) //don't want this without a holder
qdel(src)
set_desc(steps.len)
return
/datum/construction/proc/next_step()
steps.len--
if(!steps.len)
spawn_result()
else
set_desc(steps.len)
return
/datum/construction/proc/action(atom/used_atom,mob/user)
return
/datum/construction/proc/check_step(atom/used_atom,mob/user) //check last step only
var/valid_step = is_right_key(used_atom)
if(valid_step)
if(custom_action(valid_step, used_atom, user))
next_step()
return 1
return 0
/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type.
var/list/L = steps[steps.len]
if(istype(used_atom, L["key"]))
return steps.len
return 0
/datum/construction/proc/custom_action(step, used_atom, user)
return 1
/datum/construction/proc/check_all_steps(atom/used_atom,mob/user) //check all steps, remove matching one.
for(var/i=1;i<=steps.len;i++)
var/list/L = steps[i];
if(istype(used_atom, L["key"]))
if(custom_action(i, used_atom, user))
steps[i]=null;//stupid byond list from list removal...
listclearnulls(steps);
if(!steps.len)
spawn_result()
return 1
return 0
/datum/construction/proc/spawn_result()
if(result)
new result(get_turf(holder))
qdel(holder)
return
/datum/construction/proc/spawn_mecha_result()
if(result)
var/obj/mecha/m = new result(get_turf(holder))
var/obj/item/oldcell = locate (/obj/item/stock_parts/cell) in m
QDEL_NULL(oldcell)
m.CheckParts(holder.contents)
QDEL_NULL(holder)
/datum/construction/proc/set_desc(index as num)
var/list/step = steps[index]
holder.desc = step["desc"]
return
/datum/construction/reversible
var/index
/datum/construction/reversible/New(atom)
..()
index = steps.len
return
/datum/construction/reversible/proc/update_index(diff as num)
index+=diff
if(index==0)
spawn_result()
else
set_desc(index)
return
/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step
var/list/L = steps[index]
if(istype(used_atom, L["key"]))
return FORWARD //to the first step -> forward
else if(L["backkey"] && istype(used_atom, L["backkey"]))
return BACKWARD //to the last step -> backwards
return 0
/datum/construction/reversible/check_step(atom/used_atom,mob/user)
var/diff = is_right_key(used_atom)
if(diff)
if(custom_action(index, diff, used_atom, user))
update_index(diff)
return 1
return 0
/datum/construction/reversible/custom_action(index, diff, used_atom, user)
return 1
+26 -37
View File
@@ -1,37 +1,26 @@
/obj/mecha/combat
force = 30
internal_damage_threshold = 50
armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
/obj/mecha/combat/CheckParts(list/parts_list)
..()
var/obj/item/stock_parts/capacitor/C = locate() in contents
var/obj/item/stock_parts/scanning_module/SM = locate() in contents
step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
armor["energy"] += (C.rating * 10) //Each level of capacitor protects the mech against emp by 10%
qdel(C)
qdel(SM)
/obj/mecha/combat/moved_inside(mob/living/carbon/human/H)
if(..())
if(H.client && H.client.mouse_pointer_icon == initial(H.client.mouse_pointer_icon))
H.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi'
return 1
else
return 0
/obj/mecha/combat/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
if(..())
if(occupant.client && occupant.client.mouse_pointer_icon == initial(occupant.client.mouse_pointer_icon))
occupant.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi'
return 1
else
return 0
/obj/mecha/combat/go_out()
if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi')
occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon)
..()
/obj/mecha/combat
force = 30
internal_damage_threshold = 50
armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
/obj/mecha/combat/moved_inside(mob/living/carbon/human/H)
if(..())
if(H.client && H.client.mouse_pointer_icon == initial(H.client.mouse_pointer_icon))
H.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi'
return 1
else
return 0
/obj/mecha/combat/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
if(..())
if(occupant.client && occupant.client.mouse_pointer_icon == initial(occupant.client.mouse_pointer_icon))
occupant.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi'
return 1
else
return 0
/obj/mecha/combat/go_out()
if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi')
occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon)
..()
+13
View File
@@ -202,6 +202,19 @@
GLOB.mechas_list -= src //global mech list
return ..()
/obj/mecha/CheckParts(list/parts_list)
..()
var/obj/item/C = locate(/obj/item/stock_parts/cell) in contents
cell = C
var/obj/item/stock_parts/scanning_module/SM = locate() in contents
var/obj/item/stock_parts/capacitor/CP = locate() in contents
if(SM)
step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
qdel(SM)
if(CP)
armor["energy"] += (CP.rating * 10) //Each level of capacitor protects the mech against emp by 10%
qdel(CP)
////////////////////////
////// Helpers /////////
////////////////////////
File diff suppressed because it is too large Load Diff