diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm
index a7a3981c58..7c2fabbc9b 100644
--- a/code/datums/helper_datums/construction_datum.dm
+++ b/code/datums/helper_datums/construction_datum.dm
@@ -37,7 +37,7 @@
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, text2path(L["key"])))
+ if(istype(used_atom, L["key"]))
return steps.len
return 0
@@ -47,7 +47,7 @@
proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one.
for(var/i=1;i<=steps.len;i++)
var/list/L = steps[i];
- if(istype(used_atom, text2path(L["key"])))
+ if(istype(used_atom, L["key"]))
if(custom_action(i, used_atom, user))
steps[i]=null;//stupid byond list from list removal...
listclearnulls(steps);
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index e290fddf40..67391a1854 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -27,7 +27,7 @@ var/global/datum/getrev/revdata = new("config/svndir.txt")
diary << "Unable to get [filename] contents, aborting"
return abort()
- var/list/CL = dd_text2list(text, "\n")
+ var/list/CL = tg_text2list(text, "\n")
for (var/t in CL)
if (!t)
continue
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
new file mode 100644
index 0000000000..39967ecd5c
--- /dev/null
+++ b/code/datums/helper_datums/teleport.dm
@@ -0,0 +1,170 @@
+//wrapper
+/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+ new /datum/teleport/instant/science(arglist(args))
+ return
+
+/datum/teleport
+ var/atom/movable/teleatom //atom to teleport
+ var/atom/destination //destination to teleport to
+ var/precision = 0 //teleport precision
+ var/datum/effect/effect/system/effectin //effect to show right before teleportation
+ var/datum/effect/effect/system/effectout //effect to show right after teleportation
+ var/soundin //soundfile to play before teleportation
+ var/soundout //soundfile to play after teleportation
+ var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation)
+
+
+ New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+ ..()
+ if(!Init(arglist(args)))
+ return 0
+ return 1
+
+ proc/Init(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
+ if(!setTeleatom(ateleatom))
+ return 0
+ if(!setDestination(adestination))
+ return 0
+ if(!setPrecision(aprecision))
+ return 0
+ setEffects(aeffectin,aeffectout)
+ setForceTeleport(afteleport)
+ setSounds(asoundin)
+ return 1
+
+ //must succeed
+ proc/setPrecision(aprecision)
+ if(isnum(aprecision))
+ precision = aprecision
+ return 1
+ return 0
+
+ //must succeed
+ proc/setDestination(atom/adestination)
+ if(istype(adestination))
+ destination = adestination
+ return 1
+ return 0
+
+ //must succeed in most cases
+ proc/setTeleatom(atom/movable/ateleatom)
+ if(istype(ateleatom, /obj/effect))
+ del(ateleatom)
+ return 0
+ if(istype(ateleatom))
+ teleatom = ateleatom
+ return 1
+ return 0
+
+ //custom effects must be properly set up first for instant-type teleports
+ //optional
+ proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null)
+ effectin = istype(aeffectin) ? aeffectin : null
+ effectout = istype(aeffectout) ? aeffectout : null
+ return 1
+
+ //optional
+ proc/setForceTeleport(afteleport)
+ force_teleport = afteleport
+ return 1
+
+ //optional
+ proc/setSounds(asoundin=null,asoundout=null)
+ soundin = isfile(asoundin) ? asoundin : null
+ soundout = isfile(asoundout) ? asoundout : null
+ return 1
+
+ //placeholder
+ proc/teleportChecks()
+ return 1
+
+ proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound)
+ if(location)
+ if(effect)
+ spawn(-1)
+ src = null
+ effect.attach(location)
+ effect.start()
+ if(sound)
+ spawn(-1)
+ src = null
+ playsound(location,sound,60,1)
+ return
+
+ //do the monkey dance
+ proc/doTeleport()
+
+ var/turf/destturf
+ var/turf/curturf = get_turf(teleatom)
+ if(precision)
+ var/list/posturfs = circlerangeturfs(destination,precision)
+ destturf = safepick(posturfs)
+ else
+ destturf = get_turf(destination)
+
+ if(!destturf || !curturf)
+ return 0
+
+ playSpecials(curturf,effectin,soundin)
+
+ if(force_teleport)
+ teleatom.loc.Exited(teleatom)
+ teleatom.loc = destturf
+ teleatom.loc.Entered(teleatom)
+ playSpecials(destturf,effectout,soundout)
+ else
+ if(teleatom.Move(destturf))
+ playSpecials(destturf,effectout,soundout)
+
+ return 1
+
+ proc/teleport()
+ if(teleportChecks())
+ return doTeleport()
+ return 0
+
+/datum/teleport/instant //teleports when datum is created
+
+ New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+ if(..())
+ teleport()
+ return
+
+
+/datum/teleport/instant/science
+
+ setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
+ if(!aeffectin || !aeffectout)
+ var/datum/effect/effect/system/spark_spread/aeffect = new
+ aeffect.set_up(5, 1, teleatom)
+ effectin = effectin || aeffect
+ effectout = effectout || aeffect
+ return 1
+ else
+ return ..()
+
+ setPrecision(aprecision)
+ ..()
+ if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
+
+ var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
+ if(bagholding.len)
+ precision = max(rand(1,100)*bagholding.len,100)
+ if(istype(teleatom, /mob/living))
+ var/mob/living/MM = teleatom
+ MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!"
+ return 1
+
+ teleportChecks()
+ if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
+ teleatom.visible_message("\red The [teleatom] bounces off of the portal!")
+ return 0
+ if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
+ if(istype(teleatom, /mob/living))
+ var/mob/living/MM = teleatom
+ MM.visible_message("\red The [MM] bounces off of the portal!","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
+ else
+ teleatom.visible_message("\red The [teleatom] bounces off of the portal!")
+ return 0
+ return 1
\ No newline at end of file
diff --git a/code/defines/atom.dm b/code/defines/atom.dm
index f127596e36..151b81198a 100644
--- a/code/defines/atom.dm
+++ b/code/defines/atom.dm
@@ -91,6 +91,31 @@ obj
return 1
return
+/*
+ * atom/proc/search_contents_for(path,list/filter_path=null)
+ * Recursevly searches all atom contens (including contents contents and so on).
+ *
+ * ARGS: path - search atom contents for atoms of this type
+ * list/filter_path - if set, contents of atoms not of types in this list are excluded from search.
+ *
+ * RETURNS: list of found atoms
+ */
+
+/atom/proc/search_contents_for(path,list/filter_path=null)
+ var/list/found = list()
+ for(var/atom/A in src)
+ if(istype(A, path))
+ found += A
+ if(filter_path)
+ var/pass = 0
+ for(var/type in filter_path)
+ pass |= istype(A, type)
+ if(!pass)
+ continue
+ if(A.contents.len)
+ found += A.search_contents_for(path,filter_path)
+ return found
+
/atom/movable/overlay/attackby(a, b)
if (src.master)
return src.master.attackby(a, b)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index a9a8c55b68..5f6378cfaf 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -111,11 +111,10 @@
return T
/obj/machinery/teleport/hub/Bumped(M as mob|obj)
- spawn( 0 )
+ spawn()
if (src.icon_state == "tele1")
teleport(M)
use_power(5000)
- return
return
/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj)
@@ -131,7 +130,7 @@
if(prob(5) && !accurate) //oh dear a problem, put em in deep space
do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy - 5), 3), 2)
else
- do_teleport(M, com.locked, 0) //dead-on precision
+ do_teleport(M, com.locked) //dead-on precision
else
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
@@ -139,7 +138,7 @@
for(var/mob/B in hearers(src, null))
B.show_message("\blue Test fire completed.")
return
-
+/*
/proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision)
if(istype(M, /obj/effect))
del(M)
@@ -224,7 +223,7 @@
s.set_up(5, 1, M)
s.start()
return
-
+*/
/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W)
src.attack_hand()
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index b0e1dac14e..ac3524da6a 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -12,7 +12,10 @@
/area/turret_protected/Entered(O)
..()
+ if(master && master != src)
+ return master.Entered(O)
// world << "[O] entered[src.x],[src.y],[src.z]"
+
if (istype(O, /mob/living/carbon))
if (!(O in turretTargets))
turretTargets += O
@@ -24,6 +27,8 @@
return 1
/area/turret_protected/Exited(O)
+ if(master && master != src)
+ return master.Exited(O)
// world << "[O] exited [src.x],[src.y],[src.z]"
if (istype(O, /mob))
if (!istype(O, /mob/living/silicon))
@@ -113,6 +118,8 @@
/obj/machinery/turret/proc/get_protected_area()
var/area/turret_protected/TP = get_area(src)
if(istype(TP))
+ if(TP.master && TP.master != TP)
+ TP = TP.master
return TP
return
@@ -189,7 +196,7 @@
/obj/machinery/turret/proc/shootAt(var/atom/movable/target)
var/turf/T = get_turf(src)
var/turf/U = get_turf(target)
- if (!istype(T) || !istype(U))
+ if (!T || !U)
return
var/obj/item/projectile/A
if (src.lasers)
@@ -287,7 +294,11 @@
/obj/machinery/turretid/New()
..()
if(!control_area)
- control_area = get_area(src)
+ var/area/CA = get_area(src)
+ if(CA.master && CA.master != CA)
+ control_area = CA.master
+ else
+ control_area = CA
else if(istext(control_area))
for(var/area/A in world)
if(A.name && A.name==control_area)
@@ -395,7 +406,7 @@
var/projectiles = 100
var/projectiles_per_shot = 2
var/deviation = 0.3
- var/list/snapshot = list()
+ var/list/exclude = list()
var/atom/cur_target
var/scan_range = 7
var/health = 40
@@ -430,8 +441,7 @@
bullet_act(var/obj/item/projectile/Proj)
- var/damage = Proj.damage
- src.take_damage(damage)
+ src.take_damage(Proj.damage)
..()
return
@@ -468,7 +478,8 @@
src.on = !src.on
if(src.on)
spawn(50)
- src.process()
+ if(src)
+ src.process()
if(href_list["scan_range"])
src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8)
if(href_list["scan_for"])
@@ -508,19 +519,24 @@
var/target = null
if(scan_for["human"])
for(var/mob/living/carbon/human/M in oview(scan_range,src))
- if(!M.stat && !M.lying)
- pos_targets += M
+ if(M.stat || M.lying || M in exclude)
+ continue
+ pos_targets += M
if(scan_for["cyborg"])
for(var/mob/living/silicon/M in oview(scan_range,src))
- if(!M.stat && !M.lying)
- pos_targets += M
+ if(M.stat || M.lying || M in exclude)
+ continue
+ pos_targets += M
if(scan_for["mecha"])
for(var/obj/mecha/M in oview(scan_range, src))
+ if(M in exclude)
+ continue
pos_targets += M
if(scan_for["alien"])
for(var/mob/living/carbon/alien/M in oview(scan_range,src))
- if(!M.stat && !M.lying)
- pos_targets += M
+ if(M.stat || M.lying || M in exclude)
+ continue
+ pos_targets += M
if(pos_targets.len)
target = pick(pos_targets)
return target
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index ff21096981..f1a36a3800 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -6,6 +6,7 @@
var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall)
internal_damage_threshold = 50
maint_access = 0
+ damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8)
/*
/obj/mecha/combat/verb/switch_weapon()
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index b80e5e70d2..964318a4c1 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -6,12 +6,13 @@
dir_in = 1 //Facing North.
health = 400
deflect_chance = 20
+ damage_absorption = list("brute"=0.4,"fire"=1.1,"bullet"=0.6,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
max_temperature = 3000
infra_luminosity = 8
force = 40
var/defence = 0
var/defence_deflect = 35
- wreckage = "/obj/effect/decal/mecha_wreckage/durand"
+ wreckage = /obj/effect/decal/mecha_wreckage/durand
/*
/obj/mecha/combat/durand/New()
@@ -35,7 +36,7 @@
/obj/mecha/combat/durand/verb/defence_mode()
set category = "Exosuit Interface"
set name = "Toggle defence mode"
- set src in view(0)
+ set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 4a4fd6e84e..0cb3c89388 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -6,10 +6,11 @@
dir_in = 1 //Facing North.
health = 300
deflect_chance = 15
+ damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.6,"energy"=0.7,"bomb"=1)
max_temperature = 3500
infra_luminosity = 6
var/overload = 0
- wreckage = "/obj/effect/decal/mecha_wreckage/gygax"
+ wreckage = /obj/effect/decal/mecha_wreckage/gygax
internal_damage_threshold = 35
max_equip = 4
@@ -27,7 +28,7 @@
/obj/mecha/combat/gygax/verb/overload()
set category = "Exosuit Interface"
set name = "Toggle leg actuators overload"
- set src in view(0)
+ set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index 3047b86b99..a874ec9805 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -6,10 +6,11 @@
health = 140
deflect_chance = 60
internal_damage_threshold = 60
+ damage_absorption = list("brute"=1.2,"fire"=1.5,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
max_temperature = 3500
infra_luminosity = 5
operation_req_access = list(access_clown)
- wreckage = "/obj/effect/decal/mecha_wreckage/honker"
+ wreckage = /obj/effect/decal/mecha_wreckage/honker
add_req_access = 0
max_equip = 3
var/squeak = 0
@@ -123,8 +124,8 @@
-/obj/mecha/combat/honker/relaymove(mob/user,direction)
- var/result = ..()
+/obj/mecha/combat/honker/mechstep(direction)
+ var/result = step(src,direction)
if(result)
if(!squeak)
playsound(src, "clownstep", 70, 1)
@@ -133,7 +134,6 @@
squeak = 0
return result
-
obj/mecha/combat/honker/Topic(href, href_list)
..()
if (href_list["play_sound"])
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 1e6cc6dfdf..7b2c66b8b9 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -5,6 +5,7 @@
step_in = 5
health = 500
deflect_chance = 25
+ damage_absorption = list("brute"=0.4,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
max_temperature = 5000
infra_luminosity = 3
var/zoom = 0
@@ -14,7 +15,7 @@
var/smoke_cooldown = 100
var/datum/effect/effect/system/harmless_smoke_spread/smoke_system = new
operation_req_access = list(access_cent_specops)
- wreckage = "/obj/effect/decal/mecha_wreckage/marauder"
+ wreckage = /obj/effect/decal/mecha_wreckage/marauder
add_req_access = 0
internal_damage_threshold = 25
force = 45
@@ -27,7 +28,7 @@
operation_req_access = list(access_cent_creed)
step_in = 3
health = 550
- wreckage = "/obj/effect/decal/mecha_wreckage/seraph"
+ wreckage = /obj/effect/decal/mecha_wreckage/seraph
internal_damage_threshold = 20
force = 55
max_equip = 5
@@ -37,11 +38,11 @@
name = "Mauler"
icon_state = "mauler"
operation_req_access = list(access_syndicate)
- wreckage = "/obj/effect/decal/mecha_wreckage/mauler"
+ wreckage = /obj/effect/decal/mecha_wreckage/mauler
/obj/mecha/combat/marauder/New()
..()
- var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/pulse
+ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
ME.attach(src)
@@ -97,12 +98,11 @@
var/tmp_step_energy_drain = step_energy_drain
var/move_result = 0
if(internal_damage&MECHA_INT_CONTROL_LOST)
- move_result = step_rand(src)
+ move_result = mechsteprand()
else if(src.dir!=direction)
- src.dir=direction
- move_result = 1
+ move_result = mechturn(direction)
else
- move_result = step(src,direction)
+ move_result = mechstep(direction)
if(move_result)
if(istype(src.loc, /turf/space))
if(!src.check_for_support())
@@ -121,7 +121,7 @@
/obj/mecha/combat/marauder/verb/toggle_thrusters()
set category = "Exosuit Interface"
set name = "Toggle thrusters"
- set src in view(0)
+ set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
@@ -136,7 +136,7 @@
/obj/mecha/combat/marauder/verb/smoke()
set category = "Exosuit Interface"
set name = "Smoke"
- set src in view(0)
+ set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
@@ -151,7 +151,7 @@
/obj/mecha/combat/marauder/verb/zoom()
set category = "Exosuit Interface"
set name = "Zoom"
- set src in view(0)
+ set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index b441c76ead..2cb59a5591 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -7,9 +7,10 @@
step_energy_drain = 3
health = 200
deflect_chance = 30
+ damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7)
max_temperature = 1000
infra_luminosity = 3
- wreckage = "/obj/effect/decal/mecha_wreckage/phazon"
+ wreckage = /obj/effect/decal/mecha_wreckage/phazon
add_req_access = 1
internal_damage_threshold = 25
force = 15
@@ -50,7 +51,7 @@
/obj/mecha/combat/phazon/verb/switch_damtype()
set category = "Exosuit Interface"
set name = "Change melee damage type"
- set src in view(0)
+ set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index ea3f327030..9739c80994 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -50,6 +50,11 @@
del src
return
+/obj/item/mecha_parts/mecha_equipment/proc/critfail()
+ if(chassis)
+ chassis.log_message("Critical failure of component: [src]",1)
+ return
+
/obj/item/mecha_parts/mecha_equipment/proc/get_equip_info()
if(!chassis) return
return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]"
@@ -70,6 +75,8 @@
return 0
if(!equip_ready)
return 0
+ if(crit_fail)
+ return 0
return 1
/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 035afd5c26..65f6a29f0e 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -401,7 +401,7 @@
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants.
name = "Armor Booster Module (Close Combat Weaponry)"
- desc = "Boosts exosuit armor against armed melee attacks."
+ desc = "Boosts exosuit armor against armed melee attacks. Requires energy to operate."
icon_state = "mecha_abooster_ccw"
origin_tech = "materials=3"
equip_cooldown = 10
@@ -452,7 +452,7 @@
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
name = "Armor Booster Module (Ranged Weaponry)"
- desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots."
+ desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots. Requires energy to operate."
icon_state = "mecha_abooster_proj"
origin_tech = "materials=4"
equip_cooldown = 10
@@ -493,7 +493,7 @@
chassis.visible_message("The [chassis.name] armor deflects the projectile")
chassis.log_append_to_last("Armor saved.")
else
- chassis.take_damage(round(Proj.damage*src.damage_coeff))
+ chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.flag)
chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
set_ready_state(0)
chassis.use_power(energy_drain)
@@ -558,9 +558,9 @@
return
get_equip_info()
- var/output = ..()
- output += " - [pr_repair_droid.active()?"Dea":"A"]ctivate"
- return output
+ if(!chassis) return
+ return "* [src.name] - [pr_repair_droid.active()?"Dea":"A"]ctivate"
+
Topic(href, href_list)
..()
@@ -656,9 +656,8 @@
return
get_equip_info()
- var/output = ..()
- output += " - [pr_energy_relay.active()?"Dea":"A"]ctivate"
- return output
+ if(!chassis) return
+ return "* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate"
proc/dynusepower(amount)
if(!equip_ready) //enabled
@@ -700,6 +699,139 @@
return
+
+/obj/item/mecha_parts/mecha_equipment/plasma_generator
+ name = "Plasma Converter"
+ desc = "Generates power using solid plasma as fuel. Pollutes the environment."
+ icon_state = "tesla"
+ origin_tech = "plasmatech=2;powerstorage=2;engineering"
+ equip_cooldown = 10
+ energy_drain = 0
+ range = MELEE
+ construction_cost = list("metal"=10000,"silver"=500,"glass"=1000)
+ var/datum/global_iterator/pr_mech_plasma_generator
+ var/coeff = 100
+ var/fuel = 0
+ var/max_fuel = 150000
+ var/fuel_per_cycle_idle = 100
+ var/fuel_per_cycle_active = 500
+ var/power_per_cycle = 10
+ reliability = 999
+
+ New()
+ ..()
+ pr_mech_plasma_generator = new /datum/global_iterator/mecha_plasma_generator(list(src),0)
+ pr_mech_plasma_generator.set_delay(equip_cooldown)
+ return
+
+ detach()
+ pr_mech_plasma_generator.stop()
+ ..()
+ return
+
+
+ Topic(href, href_list)
+ ..()
+ if(href_list["toggle"])
+ if(pr_mech_plasma_generator.toggle())
+ set_ready_state(0)
+ chassis.log_message("[src] activated.")
+ else
+ set_ready_state(1)
+ chassis.log_message("[src] deactivated.")
+ return
+
+ get_equip_info()
+ var/output = ..()
+ if(output)
+ return "[output] \[Plasma: [fuel] cm3\] - [pr_mech_plasma_generator.active()?"Dea":"A"]ctivate"
+ return
+
+ action(target)
+ if(chassis)
+ var/result = load_fuel(target)
+ var/message
+ if(isnull(result))
+ message = "Plasma traces in target minimal. [target] cannot be used as fuel."
+ else if(!result)
+ message = "Unit is full."
+ else
+ message = "[result] units of plasma successfully loaded."
+ send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
+ chassis.occupant_message(message)
+ return
+
+ proc/load_fuel(var/obj/item/stack/sheet/plasma/P)
+ if(istype(P) && P.amount)
+ var/to_load = max(max_fuel - fuel,0)
+ if(to_load)
+ var/units = min(max(round(to_load / P.perunit),1),P.amount)
+ if(units)
+ fuel += units * P.perunit
+ P.use(units)
+ return units
+ else
+ return 0
+ return
+
+ attackby(weapon,mob/user)
+ var/result = load_fuel(weapon)
+ if(isnull(result))
+ user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","Plasma traces minimal. [weapon] cannot be used as fuel.")
+ else if(!result)
+ user << "Unit is full."
+ else
+ user.visible_message("[user] loads [src] with plasma.","[result] units of plasma successfully loaded.")
+ return
+
+ critfail()
+ ..()
+ var/turf/simulated/T = get_turf(src)
+ var/datum/gas_mixture/GM = new
+ if(prob(10))
+ GM.toxins += 100
+ GM.temperature = 1500+T0C //should be enough to start a fire
+ T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.")
+ destroy()
+ else
+ GM.toxins += 5
+ GM.temperature = istype(T) ? T.air.return_temperature() : T20C
+ T.assume_air(GM)
+ T.visible_message("The [src] suddenly disgorges a cloud of plasma.")
+ T.assume_air(GM)
+ return
+
+/datum/global_iterator/mecha_plasma_generator
+
+ process(var/obj/item/mecha_parts/mecha_equipment/plasma_generator/EG)
+ if(!EG.chassis)
+ EG.set_ready_state(1)
+ return stop()
+ if(EG.fuel<=0)
+ EG.set_ready_state(1)
+ stop()
+ EG.chassis.log_message("[src] deactivated.")
+ send_byjax(EG.chassis.occupant,"exosuit.browser","\ref[EG]",EG.get_equip_info())
+ return
+ if(rand(0,1000)>EG.reliability)
+ EG.critfail()
+ return stop()
+ var/cur_charge = EG.chassis.get_charge()
+ if(isnull(cur_charge))
+ EG.set_ready_state(1)
+ EG.chassis.occupant_message("No powercell detected.")
+ EG.chassis.log_message("[src] deactivated.")
+ return stop()
+ var/use_fuel = EG.fuel_per_cycle_idle
+ if(cur_charge[src] beeps, \"Not enough resources. Queue processing stopped\".")
+ src.visible_message("\icon[src] [src] beeps, \"Not enough resources. Queue processing stopped\".")
temp = {"Not enough resources to build next part.
Try again | Return"}
return 0
remove_from_queue(1)
build_part(part)
part = listgetindex(src.queue, 1)
- src.visible_message("[src] beeps, \"Queue processing finished successfully\".")
+ src.visible_message("\icon[src] [src] beeps, \"Queue processing finished successfully\".")
return 1
proc/list_queue()
@@ -361,7 +362,7 @@
temp += "Return"
src.updateUsrDialog()
if(i || tech_output)
- src.visible_message("[src] beeps, \"Succesfully synchronized with R&D server. New data processed.\"")
+ src.visible_message("\icon[src] [src] beeps, \"Succesfully synchronized with R&D server. New data processed.\"")
return
proc/get_resource_cost_w_coeff(var/obj/item/mecha_parts/part as obj,var/resource as text, var/roundto=1)
@@ -434,11 +435,13 @@
..()
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
if(href_list["part_set"])
- if(href_list["part_set"]=="clear")
- src.part_set = null
- else
- src.part_set = href_list["part_set"]
- screen = "parts"
+ var/tpart_set = filter.getStr("part_set")
+ if(tpart_set)
+ if(tpart_set=="clear")
+ src.part_set = null
+ else
+ src.part_set = tpart_set
+ screen = "parts"
if(href_list["part"])
var/list/part = filter.getObj("part")
if(!processing_queue)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index d05e458ba8..22d924fc5c 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -25,6 +25,7 @@
var/step_energy_drain = 10
var/health = 300 //health is health
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
+ var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1)
var/obj/item/weapon/cell/cell
var/state = 0
var/list/log = new
@@ -151,6 +152,7 @@
/obj/mecha/proc/range_action(atom/target)
return
+
/*
/obj/mecha/verb/test_int_damage()
set name = "Test internal damage"
@@ -196,12 +198,11 @@
return 0
var/move_result = 0
if(internal_damage&MECHA_INT_CONTROL_LOST)
- move_result = step_rand(src)
+ move_result = mechsteprand()
else if(src.dir!=direction)
- src.dir=direction
- move_result = 1
+ move_result = mechturn(direction)
else
- move_result = step(src,direction)
+ move_result = mechstep(direction)
if(occupant)
for(var/obj/effect/speech_bubble/B in range(1, src))
if(B.parent == occupant)
@@ -219,6 +220,24 @@
return 1
return 0
+/obj/mecha/proc/mechturn(direction)
+ dir = direction
+ playsound(src,'mechturn.ogg',40,1)
+ return 1
+
+/obj/mecha/proc/mechstep(direction)
+ var/result = step(src,direction)
+ if(result)
+ playsound(src,'mechstep.ogg',40,1)
+ return result
+
+/obj/mecha/proc/mechsteprand()
+ var/result = step_rand(src)
+ if(result)
+ playsound(src,'mechstep.ogg',40,1)
+ return result
+
+
/*
/obj/mecha/proc/inertial_movement(direction)
src.inertia_dir = direction
@@ -271,16 +290,15 @@
/obj/mecha/proc/take_damage(amount, type="brute")
if(amount)
- switch(type)
- if("brute")
- src.health -= amount
- if("fire")
- amount *= 1.2
- src.health -= amount
+ var/damage = absorbDamage(amount,type)
+ src.health -= damage
src.update_health()
- src.log_append_to_last("Took [amount] points of damage. Damage type: \"[type]\".",1)
+ src.log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1)
return
+/obj/mecha/proc/absorbDamage(damage,damage_type)
+ return damage*(listgetindex(damage_absorption,damage_type) || 1)
+
/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)
if(!islist(possible_int_damage) || isemptylist(possible_int_damage)) return
if(prob(20))
@@ -288,13 +306,12 @@
for(var/T in possible_int_damage)
if(internal_damage & T)
possible_int_damage -= T
- if(possible_int_damage)
- var/int_dam_flag = pick(possible_int_damage)
- if(int_dam_flag)
- src.internal_damage |= int_dam_flag
- src.pr_internal_damage.start()
- src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1)
- src.occupant << sound('warning-buzzer.ogg',wait=0)
+ var/int_dam_flag = safepick(possible_int_damage)
+ if(int_dam_flag)
+ src.internal_damage |= int_dam_flag
+ src.pr_internal_damage.start()
+ src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1)
+ src.occupant << sound('warning-buzzer.ogg',wait=0)
if(prob(5))
if(ignore_threshold || src.health*100/initial(src.health) 10)
+ n = 10
+ number = n
+ cardinals = c
+ location = loc
+ setup = 1
+
+ proc/attach(atom/atom)
+ holder = atom
+
+ proc/start()
+
+
/////////////////////////////////////////////
// GENERIC STEAM SPREAD SYSTEM
@@ -86,44 +108,31 @@ steam.start() -- spawns the effect
density = 0
/datum/effect/effect/system/steam_spread
- var/number = 3
- var/cardinals = 0
- var/turf/location
- var/atom/holder
-
-/datum/effect/effect/system/steam_spread/proc/set_up(n = 3, c = 0, turf/loc)
- if(n > 10)
- n = 10
- number = n
- cardinals = c
- location = loc
-
-/datum/effect/effect/system/steam_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/steam_spread/proc/start()
- var/i = 0
- for(i=0, i 10)
+ n = 10
+ number = n
+ cardinals = c
+ location = loc
+ start()
+ var/i = 0
+ for(i=0, i 10)
- n = 10
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
-
-/datum/effect/effect/system/spark_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/spark_spread/proc/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location)
- src.total_sparks++
- var/direction
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 10)
+ n = 10
+ number = n
+ cardinals = c
+ if(istype(loca, /turf/))
+ location = loca
+ else
+ location = get_turf(loca)
+ start()
+ var/i = 0
+ for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location)
+ src.total_sparks++
+ var/direction
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+ for(i=0, i 10)
- n = 10
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
-
-
-/datum/effect/effect/system/harmless_smoke_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/harmless_smoke_spread/proc/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/harmless_smoke/smoke = new /obj/effect/effect/harmless_smoke(src.location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 10)
+ n = 10
+ number = n
+ cardinals = c
+ if(istype(loca, /turf/))
+ location = loca
+ else
+ location = get_turf(loca)
+ if(direct)
+ direction = direct
+ start()
+ var/i = 0
+ for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/harmless_smoke/smoke = new /obj/effect/effect/harmless_smoke(src.location)
+ src.total_smoke++
+ var/direction = src.direction
+ if(!direction)
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+ for(i=0, i 20)
- n = 20
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
+ set_up(n = 5, c = 0, loca, direct)
+ if(n > 20)
+ n = 20
+ number = n
+ cardinals = c
+ if(istype(loca, /turf/))
+ location = loca
+ else
+ location = get_turf(loca)
+ if(direct)
+ direction = direct
-
-/datum/effect/effect/system/bad_smoke_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/bad_smoke_spread/proc/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/bad_smoke/smoke = new /obj/effect/effect/bad_smoke(src.location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/bad_smoke/smoke = new /obj/effect/effect/bad_smoke(src.location)
+ src.total_smoke++
+ var/direction = src.direction
+ if(!direction)
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+ for(i=0, i 20)
- n = 20
- number = n
- cardinals = c
- carry.copy_to(chemholder, carry.total_volume)
+ set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct)
+ if(n > 20)
+ n = 20
+ number = n
+ cardinals = c
+ carry.copy_to(chemholder, carry.total_volume)
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
-
-
-/datum/effect/effect/system/chem_smoke_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/chem_smoke_spread/proc/start()
- var/i = 0
-
- // Calculate the smokes' color
- var/list/rgbcolor = list(0,0,0)
- var/finalcolor
- for(var/datum/reagent/re in chemholder.reagents.reagent_list)
- if(!finalcolor)
- rgbcolor = GetColors(re.color)
- finalcolor = re.color
+ if(istype(loca, /turf/))
+ location = loca
else
- var/newcolor[3]
- var/prergbcolor[3]
- prergbcolor = rgbcolor
- newcolor = GetColors(re.color)
+ location = get_turf(loca)
+ if(direct)
+ direction = direct
- rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
- rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
- rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
+ start()
+ var/i = 0
- finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
-
- if(finalcolor)
- finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3]) // slightly darker color
-
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/chem_smoke/smoke = new /obj/effect/effect/chem_smoke(src.location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
-
- if(chemholder.reagents.total_volume != 1) // can't split 1 very well
- chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly
-
- if(finalcolor)
- smoke.icon += finalcolor // give the smoke color, if it has any to begin with
+ // Calculate the smokes' color
+ var/list/rgbcolor = list(0,0,0)
+ var/finalcolor
+ for(var/datum/reagent/re in chemholder.reagents.reagent_list)
+ if(!finalcolor)
+ rgbcolor = GetColors(re.color)
+ finalcolor = re.color
else
- // if no color, just use the old smoke icon
- smoke.icon = '96x96.dmi'
- smoke.icon_state = "smoke"
+ var/newcolor[3]
+ var/prergbcolor[3]
+ prergbcolor = rgbcolor
+ newcolor = GetColors(re.color)
- for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/chem_smoke/smoke = new /obj/effect/effect/chem_smoke(src.location)
+ src.total_smoke++
+ var/direction = src.direction
+ if(!direction)
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+
+ if(chemholder.reagents.total_volume != 1) // can't split 1 very well
+ chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly
+
+ if(finalcolor)
+ smoke.icon += finalcolor // give the smoke color, if it has any to begin with
+ else
+ // if no color, just use the old smoke icon
+ smoke.icon = '96x96.dmi'
+ smoke.icon_state = "smoke"
+
+ for(i=0, i 20)
- n = 20
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
+ set_up(n = 5, c = 0, loca, direct)
+ if(n > 20)
+ n = 20
+ number = n
+ cardinals = c
+ if(istype(loca, /turf/))
+ location = loca
+ else
+ location = get_turf(loca)
+ if(direct)
+ direction = direct
-/datum/effect/effect/system/sleep_smoke_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/sleep_smoke_spread/proc/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/sleep_smoke/smoke = new /obj/effect/effect/sleep_smoke(src.location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/sleep_smoke/smoke = new /obj/effect/effect/sleep_smoke(src.location)
+ src.total_smoke++
+ var/direction = src.direction
+ if(!direction)
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+ for(i=0, i 20)
- n = 20
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
-
-/datum/effect/effect/system/mustard_gas_spread/proc/attach(atom/atom)
- holder = atom
-
-/datum/effect/effect/system/mustard_gas_spread/proc/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/mustard_gas/smoke = new /obj/effect/effect/mustard_gas(src.location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 20)
+ n = 20
+ number = n
+ cardinals = c
+ if(istype(loca, /turf/))
+ location = loca
+ else
+ location = get_turf(loca)
+ if(direct)
+ direction = direct
+ start()
+ var/i = 0
+ for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/mustard_gas/smoke = new /obj/effect/effect/mustard_gas(src.location)
+ src.total_smoke++
+ var/direction = src.direction
+ if(!direction)
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+ for(i=0, i 0)
- devastation = min (MAX_EXPLOSION_RANGE, devastation + round(amount/12))
+ start()
+ if (amount <= 2)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, location)
+ s.start()
- if (round(amount/6) > 0)
- heavy = min (MAX_EXPLOSION_RANGE, heavy + round(amount/6))
+ for(var/mob/M in viewers(5, location))
+ M << "\red The solution violently explodes."
+ for(var/mob/M in viewers(1, location))
+ if (prob (50 * amount))
+ M << "\red The explosion knocks you down."
+ M.weakened += rand (1, 5)
+ return
+ else
+ var/devastation = -1
+ var/heavy = -1
+ var/light = -1
+ var/flash = -1
- if (round(amount/3) > 0)
- light = min (MAX_EXPLOSION_RANGE, light + round(amount/3))
+ // Clamp all values to MAX_EXPLOSION_RANGE
+ if (round(amount/12) > 0)
+ devastation = min (MAX_EXPLOSION_RANGE, devastation + round(amount/12))
- if (flash && flashing_factor)
- flash += (round(amount/4) * flashing_factor)
+ if (round(amount/6) > 0)
+ heavy = min (MAX_EXPLOSION_RANGE, heavy + round(amount/6))
- for(var/mob/M in viewers(8, location))
- M << "\red The solution violently explodes."
+ if (round(amount/3) > 0)
+ light = min (MAX_EXPLOSION_RANGE, light + round(amount/3))
- explosion(location, devastation, heavy, light, flash)
\ No newline at end of file
+ if (flash && flashing_factor)
+ flash += (round(amount/4) * flashing_factor)
+
+ for(var/mob/M in viewers(8, location))
+ M << "\red The solution violently explodes."
+
+ explosion(location, devastation, heavy, light, flash)
\ No newline at end of file
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 5cd027f891..2773409049 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -604,7 +604,15 @@ datum
id = "mech_laser"
build_type = MECHFAB
req_tech = list("combat" = 3, "magnets" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/laser"
+ build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser"
+
+ mech_laser_heavy
+ name = "Exosuit Weapon Design (CH-LC \"Solaris\" Laser Cannon)"
+ desc = "Allows for the construction of CH-LC Laser Cannon."
+ id = "mech_laser_heavy"
+ build_type = MECHFAB
+ req_tech = list("combat" = 4, "magnets" = 4)
+ build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy"
mech_grenade_launcher
name = "Exosuit Weapon Design (SGL-6 Grenade Launcher)"
@@ -654,6 +662,14 @@ datum
req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3)
build_path = "/obj/item/mecha_parts/mecha_equipment/repair_droid"
+ mech_plasma_generator
+ name = "Exosuit Module Design (Plasma Converter Module)"
+ desc = "Exosuit-mounted plasma converter."
+ id = "mech_plasma_generator"
+ build_type = MECHFAB
+ req_tech = list("plasmatech" = 2, "powerstorage"= 2, "engineering" = 2)
+ build_path = "/obj/item/mecha_parts/mecha_equipment/plasma_generator"
+
////////////////////////////////////////
//////////Disk Construction Disks///////
////////////////////////////////////////
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index fbe6ff2b1e..34ee129b99 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -77,6 +77,23 @@ research holder datum.
else
return 0
+ //Checks to see if design has all the required pre-reqs.
+ //Input: datum/design; Output: 0/1 (false/true)
+ DesignHasReqs(var/datum/design/D)
+ if(D.req_tech.len == 0)
+ return 1
+ var/matches = 0
+ var/list/k_tech = list()
+ for(var/datum/tech/known in known_tech)
+ k_tech[known.id] = known.level
+ for(var/req in D.req_tech)
+ if(!isnull(k_tech[req]) && k_tech[req] >= D.req_tech[req])
+ matches++
+ if(matches == D.req_tech.len)
+ return 1
+ else
+ return 0
+/*
//Checks to see if design has all the required pre-reqs.
//Input: datum/design; Output: 0/1 (false/true)
DesignHasReqs(var/datum/design/D)
@@ -92,7 +109,7 @@ research holder datum.
return 1
else
return 0
-
+*/
//Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed.
//Input: datum/tech; Output: Null
AddTech2Known(var/datum/tech/T)
diff --git a/html/changelog.html b/html/changelog.html
index d63526c68a..a95d60b570 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -54,6 +54,19 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit tho. Thanks. -->
+29 October 2011
+
+ - ConstantA updated:
+
+ - Added step and turn sounds for mechs
+ - Added another mecha equipment - plasma converter. Works similar to portable generator. Uses solid plasma as fuel. Can be refueled either by clicking on it with plasma in hand, or directly from mecha - selecting it and clicking on plasma.
+ - Added mecha laser cannon.
+ - Added damage absorption for mechs. Different mechs have different absorption for different types of damage.
+ - Metal foam now blocks air movement.
+
+
+
+
29 October 2011
- Petethegoat updated:
diff --git a/sound/voice/critdestr.ogg b/sound/mecha/critdestr.ogg
similarity index 100%
rename from sound/voice/critdestr.ogg
rename to sound/mecha/critdestr.ogg
diff --git a/sound/voice/imag_enh.ogg b/sound/mecha/imag_enh.ogg
similarity index 100%
rename from sound/voice/imag_enh.ogg
rename to sound/mecha/imag_enh.ogg
diff --git a/sound/mecha/mechmove01.ogg b/sound/mecha/mechmove01.ogg
new file mode 100644
index 0000000000..9a3ce595a8
Binary files /dev/null and b/sound/mecha/mechmove01.ogg differ
diff --git a/sound/mecha/mechmove03.ogg b/sound/mecha/mechmove03.ogg
new file mode 100644
index 0000000000..5eca39d8e9
Binary files /dev/null and b/sound/mecha/mechmove03.ogg differ
diff --git a/sound/mecha/mechmove04.ogg b/sound/mecha/mechmove04.ogg
new file mode 100644
index 0000000000..fab264aea5
Binary files /dev/null and b/sound/mecha/mechmove04.ogg differ
diff --git a/sound/mecha/mechstep.ogg b/sound/mecha/mechstep.ogg
new file mode 100644
index 0000000000..66540860df
Binary files /dev/null and b/sound/mecha/mechstep.ogg differ
diff --git a/sound/mecha/mechturn.ogg b/sound/mecha/mechturn.ogg
new file mode 100644
index 0000000000..67dc345c02
Binary files /dev/null and b/sound/mecha/mechturn.ogg differ
diff --git a/sound/voice/nominal.ogg b/sound/mecha/nominal.ogg
similarity index 100%
rename from sound/voice/nominal.ogg
rename to sound/mecha/nominal.ogg
diff --git a/sound/voice/weapdestr.ogg b/sound/mecha/weapdestr.ogg
similarity index 100%
rename from sound/voice/weapdestr.ogg
rename to sound/mecha/weapdestr.ogg
diff --git a/tgstation.dme b/tgstation.dme
index 05e295dbb7..89451ee1ad 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -164,6 +164,7 @@
#define FILE_DIR "sound/effects"
#define FILE_DIR "sound/items"
#define FILE_DIR "sound/machines"
+#define FILE_DIR "sound/mecha"
#define FILE_DIR "sound/misc"
#define FILE_DIR "sound/piano"
#define FILE_DIR "sound/spells"
@@ -239,6 +240,7 @@
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\global_iterator.dm"
+#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\tension.dm"
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\spells\area_teleport.dm"