- Added atom/proc/search_contents_for. Recursively searches through all contents of all atoms inside specified one for matches, returns a list of found atoms.

- Added teleporter datum. do_teleport proc is now just a wrapper for it.
- Added damage absorption to mechs.
- Added mecha step and turn sounds.
- Cleaned effects code a bit.
- Metal foam should now block air movement.
- Since sd_ lightning library chops areas into pieces, turrets now work with master area.
- Tried to optimize DesignHasReqs proc.
- Added plasma converter and laser cannon mecha equipment.
- Other cosmetic changes.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2463 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
panurgomatic
2011-10-31 22:09:36 +00:00
parent c122bee94b
commit 3517810d11
35 changed files with 1056 additions and 727 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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 <B>The [teleatom] bounces off of the portal!</B>")
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 <B>The [MM] bounces off of the portal!</B>","\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 <B>The [teleatom] bounces off of the portal!</B>")
return 0
return 1

View File

@@ -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)

View File

@@ -111,12 +111,11 @@
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)
var/atom/l = src.loc
@@ -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()

View File

@@ -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,6 +478,7 @@
src.on = !src.on
if(src.on)
spawn(50)
if(src)
src.process()
if(href_list["scan_range"])
src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8)
@@ -508,18 +519,23 @@
var/target = null
if(scan_for["human"])
for(var/mob/living/carbon/human/M in oview(scan_range,src))
if(!M.stat && !M.lying)
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)
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)
if(M.stat || M.lying || M in exclude)
continue
pos_targets += M
if(pos_targets.len)
target = pick(pos_targets)

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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"])

View File

@@ -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

View File

@@ -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

View File

@@ -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 "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][src.name][chassis.selected==src?"</b>":"</a>"]"
@@ -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)

View File

@@ -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 += " - <a href='?src=\ref[src];toggle_repairs=1'>[pr_repair_droid.active()?"Dea":"A"]ctivate</a>"
return output
if(!chassis) return
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[src.name] - <a href='?src=\ref[src];toggle_repairs=1'>[pr_repair_droid.active()?"Dea":"A"]ctivate</a>"
Topic(href, href_list)
..()
@@ -656,9 +656,8 @@
return
get_equip_info()
var/output = ..()
output += " - <a href='?src=\ref[src];toggle_relay=1'>[pr_energy_relay.active()?"Dea":"A"]ctivate</a>"
return output
if(!chassis) return
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[src.name] - <a href='?src=\ref[src];toggle_relay=1'>[pr_energy_relay.active()?"Dea":"A"]ctivate</a>"
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] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[pr_mech_plasma_generator.active()?"Dea":"A"]ctivate</a>"
return
action(target)
if(chassis)
var/result = load_fuel(target)
var/message
if(isnull(result))
message = "<font color='red'>Plasma traces in target minimal. [target] cannot be used as fuel.</font>"
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.","<font color='red'>Plasma traces minimal. [weapon] cannot be used as fuel.</font>")
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<EG.chassis.cell.maxcharge)
use_fuel = EG.fuel_per_cycle_active
EG.chassis.give_power(EG.power_per_cycle)
send_byjax(EG.chassis.occupant,"exosuit.browser","\ref[EG]",EG.get_equip_info())
EG.fuel -= use_fuel
return
/*
/obj/item/mecha_parts/mecha_equipment/defence_shocker
name = "Exosuit Defence Shocker"

View File

@@ -2,6 +2,8 @@
name = "mecha weapon"
range = RANGED
origin_tech = "materials=3;combat=3"
var/projectile
var/fire_sound
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj)
@@ -10,11 +12,9 @@
return 1
return 0
/obj/item/mecha_parts/mecha_equipment/weapon/laser
equip_cooldown = 7
name = "CH-PS \"Immolator\" Laser"
icon_state = "mecha_laser"
energy_drain = 30
/obj/item/mecha_parts/mecha_equipment/weapon/energy
name = "General Energy Weapon"
action(target)
if(!action_checks(target)) return
@@ -25,8 +25,8 @@
if (targloc == curloc)
return
set_ready_state(0)
playsound(chassis, 'Laser.ogg', 50, 1)
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(curloc)
playsound(chassis, fire_sound, 50, 1)
var/obj/item/projectile/A = new projectile(curloc)
A.original = targloc
A.current = curloc
A.yo = targloc.y - curloc.y
@@ -37,62 +37,40 @@
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ion
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
equip_cooldown = 5
name = "CH-PS \"Immolator\" Laser"
icon_state = "mecha_laser"
energy_drain = 30
projectile = /obj/item/projectile/beam
fire_sound = 'Laser.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
equip_cooldown = 10
name = "CH-LC \"Solaris\" Laser Cannon"
icon_state = "mecha_laser"
energy_drain = 60
projectile = /obj/item/projectile/beam/heavylaser
fire_sound = 'lasercannonfire.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
equip_cooldown = 7
name = "mkIV Ion Heavy Repeater"
icon_state = "mecha_laser"
energy_drain = 120
projectile = /obj/item/projectile/ion
fire_sound = 'Laser.ogg'
action(target)
if(!action_checks(target)) return
var/turf/curloc = chassis.loc
var/atom/targloc = get_turf(target)
if (!targloc || !istype(targloc, /turf) || !curloc)
return
if (targloc == curloc)
return
set_ready_state(0)
playsound(chassis, 'Laser.ogg', 50, 1)
var/obj/item/projectile/beam/A = new /obj/item/projectile/ion(curloc)
A.original = targloc
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
chassis.use_power(energy_drain)
A.process()
chassis.log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/pulse
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
equip_cooldown = 30
name = "eZ-13 mk2 Heavy pulse rifle"
icon_state = "mecha_pulse"
energy_drain = 120
origin_tech = "materials=3;combat=6;powerstorage=4"
action(target)
if(!action_checks(target)) return
var/turf/curloc = chassis.loc
var/atom/targloc = get_turf(target)
if (!targloc || !istype(targloc, /turf) || !curloc)
return
if (targloc == curloc)
return
playsound(chassis, 'marauder.ogg', 50, 1)
var/obj/item/projectile/beam/pulse/A = new /obj/item/projectile/beam/pulse/heavy(curloc)
A.original = targloc
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
set_ready_state(0)
chassis.use_power(energy_drain)
A.process()
chassis.log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return
projectile = /obj/item/projectile/beam/pulse/heavy
fire_sound = 'marauder.ogg'
/obj/item/projectile/beam/pulse/heavy
@@ -107,35 +85,14 @@
del(src)
return
/obj/item/mecha_parts/mecha_equipment/weapon/taser
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
name = "PBT \"Pacifier\" Mounted Taser"
icon_state = "mecha_taser"
energy_drain = 20
equip_cooldown = 6
projectile = /obj/item/projectile/energy/electrode
fire_sound = 'Laser.ogg'
action(target)
if(!action_checks(target)) return
var/turf/curloc = chassis.loc
var/atom/targloc = get_turf(target)
if (!targloc || !istype(targloc, /turf) || !curloc)
return
if (targloc == curloc)
return
playsound(chassis, 'Laser.ogg', 50, 1)
var/obj/item/projectile/energy/electrode/A = new /obj/item/projectile/energy/electrode(curloc)
A.original = targloc
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
set_ready_state(0)
chassis.use_power(energy_drain)
spawn()
A.process()
chassis.log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/honker
name = "HoNkER BlAsT 5000"
@@ -229,7 +186,7 @@
name = "LBX AC 10 \"Scattershot\""
icon_state = "mecha_scatter"
equip_cooldown = 20
projectiles = 100
projectiles = 40
projectile_energy_cost = 25
var/projectiles_per_shot = 4
var/deviation = 0.7
@@ -247,9 +204,8 @@
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
if(!targloc || targloc == curloc)
break
playsound(chassis, 'Gunshot.ogg', 80, 1)
var/obj/item/projectile/A = new /obj/item/projectile(curloc)
var/obj/item/projectile/bullet/A = new /obj/item/projectile/bullet(curloc)
src.projectiles--
A.original = targloc
A.current = curloc

View File

@@ -85,7 +85,7 @@
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
/obj/item/mecha_parts/mecha_equipment/weapon/taser,
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
@@ -93,7 +93,8 @@
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,
/obj/item/mecha_parts/mecha_equipment/repair_droid,
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,
/obj/item/mecha_parts/mecha_equipment/plasma_generator
),
"Misc"=list(/obj/item/mecha_tracking)
@@ -287,14 +288,14 @@
if(stat&(NOPOWER|BROKEN))
return 0
if(!check_resources(part))
src.visible_message("<b>[src]</b> beeps, \"Not enough resources. Queue processing stopped\".")
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Not enough resources. Queue processing stopped\".")
temp = {"<font color='red'>Not enough resources to build next part.</font><br>
<a href='?src=\ref[src];process_queue=1'>Try again</a> | <a href='?src=\ref[src];clear_temp=1'>Return</a><a>"}
return 0
remove_from_queue(1)
build_part(part)
part = listgetindex(src.queue, 1)
src.visible_message("<b>[src]</b> beeps, \"Queue processing finished successfully\".")
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Queue processing finished successfully\".")
return 1
proc/list_queue()
@@ -361,7 +362,7 @@
temp += "<a href='?src=\ref[src];clear_temp=1'>Return</a>"
src.updateUsrDialog()
if(i || tech_output)
src.visible_message("<b>[src]</b> beeps, \"Succesfully synchronized with R&D server. New data processed.\"")
src.visible_message("\icon[src] <b>[src]</b> 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,10 +435,12 @@
..()
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
if(href_list["part_set"])
if(href_list["part_set"]=="clear")
var/tpart_set = filter.getStr("part_set")
if(tpart_set)
if(tpart_set=="clear")
src.part_set = null
else
src.part_set = href_list["part_set"]
src.part_set = tpart_set
screen = "parts"
if(href_list["part"])
var/list/part = filter.getObj("part")

View File

@@ -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,8 +306,7 @@
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)
var/int_dam_flag = safepick(possible_int_damage)
if(int_dam_flag)
src.internal_damage |= int_dam_flag
src.pr_internal_damage.start()
@@ -395,11 +412,10 @@
return
if(istype(Proj, /obj/item/projectile/beam/pulse))
ignore_threshold = 1
src.take_damage(Proj.damage)
src.take_damage(Proj.damage,Proj.flag)
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST),ignore_threshold)
return
/obj/mecha/proc/destroy()
spawn()
go_out()
@@ -408,8 +424,9 @@
loc.Exited(src)
loc = null
if(T)
if(prob(40))
if(prob(30))
explosion(T, 0, 0, 1, 3)
spawn(0)
if(wreckage)
var/obj/effect/decal/mecha_wreckage/WR = new wreckage(T)
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
@@ -428,6 +445,7 @@
if(internal_tank)
WR.crowbar_salvage += internal_tank
internal_tank.loc = WR
spawn(0)
del(src)
return
@@ -565,7 +583,7 @@
/obj/mecha/verb/connect_to_port()
set name = "Connect to port"
set category = "Exosuit Interface"
set src in view(0)
set src = usr.loc
set popup_menu = 0
if(!src.occupant) return
if(usr!=src.occupant)
@@ -587,7 +605,7 @@
/obj/mecha/verb/disconnect_from_port()
set name = "Disconnect from port"
set category = "Exosuit Interface"
set src in view(0)
set src = usr.loc
set popup_menu = 0
if(!src.occupant) return
if(usr!=src.occupant)
@@ -599,11 +617,10 @@
else
src.occupant_message("\red [name] is not connected to the port at the moment.")
/obj/mecha/verb/toggle_lights()
set name = "Toggle Lights"
set category = "Exosuit Interface"
set src in view(0)
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
@@ -619,7 +636,7 @@
/obj/mecha/verb/toggle_internal_tank()
set name = "Toggle internal airtank usage."
set category = "Exosuit Interface"
set src in view(0)
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
@@ -741,7 +758,7 @@
/obj/mecha/verb/view_stats()
set name = "View Stats"
set category = "Exosuit Interface"
set src in view(0)
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
@@ -761,7 +778,7 @@
/obj/mecha/verb/eject()
set name = "Eject"
set category = "Exosuit Interface"
set src in view(0)
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return

View File

@@ -62,11 +62,11 @@
/datum/construction/mecha/ripley_chassis
steps = list(list("key"="/obj/item/mecha_parts/part/ripley_torso"),//1
list("key"="/obj/item/mecha_parts/part/ripley_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/ripley_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/ripley_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/ripley_right_leg")//5
steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1
list("key"=/obj/item/mecha_parts/part/ripley_left_arm),//2
list("key"=/obj/item/mecha_parts/part/ripley_right_arm),//3
list("key"=/obj/item/mecha_parts/part/ripley_left_leg),//4
list("key"=/obj/item/mecha_parts/part/ripley_right_leg)//5
)
custom_action(step, atom/used_atom, mob/user)
@@ -238,12 +238,12 @@
/datum/construction/mecha/gygax_chassis
steps = list(list("key"="/obj/item/mecha_parts/part/gygax_torso"),//1
list("key"="/obj/item/mecha_parts/part/gygax_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/gygax_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/gygax_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/gygax_right_leg"),//5
list("key"="/obj/item/mecha_parts/part/gygax_head")
steps = list(list("key"=/obj/item/mecha_parts/part/gygax_torso),//1
list("key"=/obj/item/mecha_parts/part/gygax_left_arm),//2
list("key"=/obj/item/mecha_parts/part/gygax_right_arm),//3
list("key"=/obj/item/mecha_parts/part/gygax_left_leg),//4
list("key"=/obj/item/mecha_parts/part/gygax_right_leg),//5
list("key"=/obj/item/mecha_parts/part/gygax_head)
)
custom_action(step, atom/used_atom, mob/user)
@@ -475,11 +475,11 @@
/datum/construction/mecha/firefighter_chassis
steps = list(list("key"="/obj/item/mecha_parts/part/firefighter_torso"),//1
list("key"="/obj/item/mecha_parts/part/firefighter_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/firefighter_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/firefighter_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/firefighter_right_leg")//5
steps = list(list("key"=/obj/item/mecha_parts/part/firefighter_torso),//1
list("key"=/obj/item/mecha_parts/part/firefighter_left_arm),//2
list("key"=/obj/item/mecha_parts/part/firefighter_right_arm),//3
list("key"=/obj/item/mecha_parts/part/firefighter_left_leg),//4
list("key"=/obj/item/mecha_parts/part/firefighter_right_leg)//5
)
custom_action(step, atom/used_atom, mob/user)
@@ -502,20 +502,20 @@
/datum/construction/mecha/firefighter
result = "/obj/mecha/working/firefighter"
steps = list(list("key"="/obj/item/weapon/weldingtool"),//1
list("key"="/obj/item/weapon/wrench"),//2
list("key"="/obj/item/stack/sheet/r_metal"),//3
list("key"="/obj/item/weapon/weldingtool"),//4
list("key"="/obj/item/weapon/wrench"),//5
list("key"="/obj/item/stack/sheet/metal"),//6
list("key"="/obj/item/weapon/screwdriver"),//7
list("key"="/obj/item/mecha_parts/circuitboard/firefighter/peripherals"),//8
list("key"="/obj/item/weapon/screwdriver"),//9
list("key"="/obj/item/mecha_parts/circuitboard/ripley/main"),//10
list("key"="/obj/item/weapon/wirecutters"),//11
list("key"="/obj/item/weapon/cable_coil"),//12
list("key"="/obj/item/weapon/screwdriver"),//13
list("key"="/obj/item/weapon/wrench")//14
steps = list(list("key"=/obj/item/weapon/weldingtool),//1
list("key"=/obj/item/weapon/wrench),//2
list("key"=/obj/item/stack/sheet/r_metal),//3
list("key"=/obj/item/weapon/weldingtool),//4
list("key"=/obj/item/weapon/wrench),//5
list("key"=/obj/item/stack/sheet/metal),//6
list("key"=/obj/item/weapon/screwdriver),//7
list("key"=/obj/item/mecha_parts/circuitboard/firefighter/peripherals),//8
list("key"=/obj/item/weapon/screwdriver),//9
list("key"=/obj/item/mecha_parts/circuitboard/ripley/main),//10
list("key"=/obj/item/weapon/wirecutters),//11
list("key"=/obj/item/weapon/cable_coil),//12
list("key"=/obj/item/weapon/screwdriver),//13
list("key"=/obj/item/weapon/wrench)//14
)
action(atom/used_atom,mob/user as mob)
@@ -563,12 +563,12 @@
/datum/construction/mecha/honker_chassis
steps = list(list("key"="/obj/item/mecha_parts/part/honker_torso"),//1
list("key"="/obj/item/mecha_parts/part/honker_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/honker_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/honker_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/honker_right_leg"),//5
list("key"="/obj/item/mecha_parts/part/honker_head")
steps = list(list("key"=/obj/item/mecha_parts/part/honker_torso),//1
list("key"=/obj/item/mecha_parts/part/honker_left_arm),//2
list("key"=/obj/item/mecha_parts/part/honker_right_arm),//3
list("key"=/obj/item/mecha_parts/part/honker_left_leg),//4
list("key"=/obj/item/mecha_parts/part/honker_right_leg),//5
list("key"=/obj/item/mecha_parts/part/honker_head)
)
action(atom/used_atom,mob/user as mob)
@@ -591,17 +591,17 @@
/datum/construction/mecha/honker
result = "/obj/mecha/combat/honker"
steps = list(list("key"="/obj/item/weapon/bikehorn"),//1
list("key"="/obj/item/clothing/shoes/clown_shoes"),//2
list("key"="/obj/item/weapon/bikehorn"),//3
list("key"="/obj/item/clothing/mask/gas/clown_hat"),//4
list("key"="/obj/item/weapon/bikehorn"),//5
list("key"="/obj/item/mecha_parts/circuitboard/honker/targeting"),//6
list("key"="/obj/item/weapon/bikehorn"),//7
list("key"="/obj/item/mecha_parts/circuitboard/honker/peripherals"),//8
list("key"="/obj/item/weapon/bikehorn"),//9
list("key"="/obj/item/mecha_parts/circuitboard/honker/main"),//10
list("key"="/obj/item/weapon/bikehorn"),//11
steps = list(list("key"=/obj/item/weapon/bikehorn),//1
list("key"=/obj/item/clothing/shoes/clown_shoes),//2
list("key"=/obj/item/weapon/bikehorn),//3
list("key"=/obj/item/clothing/mask/gas/clown_hat),//4
list("key"=/obj/item/weapon/bikehorn),//5
list("key"=/obj/item/mecha_parts/circuitboard/honker/targeting),//6
list("key"=/obj/item/weapon/bikehorn),//7
list("key"=/obj/item/mecha_parts/circuitboard/honker/peripherals),//8
list("key"=/obj/item/weapon/bikehorn),//9
list("key"=/obj/item/mecha_parts/circuitboard/honker/main),//10
list("key"=/obj/item/weapon/bikehorn),//11
)
action(atom/used_atom,mob/user as mob)
@@ -638,12 +638,12 @@
/datum/construction/mecha/durand_chassis
steps = list(list("key"="/obj/item/mecha_parts/part/durand_torso"),//1
list("key"="/obj/item/mecha_parts/part/durand_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/durand_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/durand_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/durand_right_leg"),//5
list("key"="/obj/item/mecha_parts/part/durand_head")
steps = list(list("key"=/obj/item/mecha_parts/part/durand_torso),//1
list("key"=/obj/item/mecha_parts/part/durand_left_arm),//2
list("key"=/obj/item/mecha_parts/part/durand_right_arm),//3
list("key"=/obj/item/mecha_parts/part/durand_left_leg),//4
list("key"=/obj/item/mecha_parts/part/durand_right_leg),//5
list("key"=/obj/item/mecha_parts/part/durand_head)
)
custom_action(step, atom/used_atom, mob/user)
@@ -665,26 +665,26 @@
/datum/construction/mecha/durand
result = "/obj/mecha/combat/durand"
steps = list(list("key"="/obj/item/weapon/weldingtool"),//1
list("key"="/obj/item/weapon/wrench"),//2
list("key"="/obj/item/mecha_parts/part/durand_armour"),//3
list("key"="/obj/item/weapon/weldingtool"),//4
list("key"="/obj/item/weapon/wrench"),//5
list("key"="/obj/item/stack/sheet/metal"),//6
list("key"="/obj/item/weapon/screwdriver"),//7
list("key"="/obj/item/weapon/stock_parts/capacitor/adv"),//8
list("key"="/obj/item/weapon/screwdriver"),//9
list("key"="/obj/item/weapon/stock_parts/scanning_module/adv"),//10
list("key"="/obj/item/weapon/screwdriver"),//11
list("key"="/obj/item/mecha_parts/circuitboard/durand/targeting"),//12
list("key"="/obj/item/weapon/screwdriver"),//13
list("key"="/obj/item/mecha_parts/circuitboard/durand/peripherals"),//14
list("key"="/obj/item/weapon/screwdriver"),//15
list("key"="/obj/item/mecha_parts/circuitboard/durand/main"),//16
list("key"="/obj/item/weapon/wirecutters"),//17
list("key"="/obj/item/weapon/cable_coil"),//18
list("key"="/obj/item/weapon/screwdriver"),//19
list("key"="/obj/item/weapon/wrench")//20
steps = list(list("key"=/obj/item/weapon/weldingtool),//1
list("key"=/obj/item/weapon/wrench),//2
list("key"=/obj/item/mecha_parts/part/durand_armour),//3
list("key"=/obj/item/weapon/weldingtool),//4
list("key"=/obj/item/weapon/wrench),//5
list("key"=/obj/item/stack/sheet/metal),//6
list("key"=/obj/item/weapon/screwdriver),//7
list("key"=/obj/item/weapon/stock_parts/capacitor/adv),//8
list("key"=/obj/item/weapon/screwdriver),//9
list("key"=/obj/item/weapon/stock_parts/scanning_module/adv),//10
list("key"=/obj/item/weapon/screwdriver),//11
list("key"=/obj/item/mecha_parts/circuitboard/durand/targeting),//12
list("key"=/obj/item/weapon/screwdriver),//13
list("key"=/obj/item/mecha_parts/circuitboard/durand/peripherals),//14
list("key"=/obj/item/weapon/screwdriver),//15
list("key"=/obj/item/mecha_parts/circuitboard/durand/main),//16
list("key"=/obj/item/weapon/wirecutters),//17
list("key"=/obj/item/weapon/cable_coil),//18
list("key"=/obj/item/weapon/screwdriver),//19
list("key"=/obj/item/weapon/wrench)//20
)
action(atom/used_atom,mob/user as mob)
@@ -748,12 +748,12 @@
/datum/construction/mecha/phazon_chassis
result = "/obj/mecha/combat/phazon"
steps = list(list("key"="/obj/item/mecha_parts/part/phazon_torso"),//1
list("key"="/obj/item/mecha_parts/part/phazon_left_arm"),//2
list("key"="/obj/item/mecha_parts/part/phazon_right_arm"),//3
list("key"="/obj/item/mecha_parts/part/phazon_left_leg"),//4
list("key"="/obj/item/mecha_parts/part/phazon_right_leg"),//5
list("key"="/obj/item/mecha_parts/part/phazon_head")
steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso),//1
list("key"=/obj/item/mecha_parts/part/phazon_left_arm),//2
list("key"=/obj/item/mecha_parts/part/phazon_right_arm),//3
list("key"=/obj/item/mecha_parts/part/phazon_left_leg),//4
list("key"=/obj/item/mecha_parts/part/phazon_right_leg),//5
list("key"=/obj/item/mecha_parts/part/phazon_head)
)
custom_action(step, atom/used_atom, mob/user)

View File

@@ -21,11 +21,15 @@
return
/obj/effect/decal/mecha_wreckage/ex_act(severity)
if(severity < 3)
if(severity < 2)
spawn
del src
return
/obj/effect/decal/mecha_wreckage/bullet_act(var/obj/item/projectile/Proj)
return
/obj/effect/decal/mecha_wreckage/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
if(salvage_num <= 0)

View File

@@ -6,7 +6,7 @@
max_temperature = 6000
health = 250
internal_damage_threshold = 40
wreckage = "/obj/effect/decal/mecha_wreckage/ripley"
wreckage = /obj/effect/decal/mecha_wreckage/ripley
infra_luminosity = 5
/*

View File

@@ -5,7 +5,7 @@
step_in = 6
max_temperature = 1000
health = 200
wreckage = "/obj/effect/decal/mecha_wreckage/ripley"
wreckage = /obj/effect/decal/mecha_wreckage/ripley
var/list/cargo = new
var/cargo_capacity = 15

View File

@@ -64,6 +64,28 @@ would spawn and follow the beaker, even if it is carried or thrown.
reagents.reaction(A)
return ..()
/datum/effect/effect/system
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/setup = 0
proc/set_up(n = 3, c = 0, turf/loc)
if(n > 10)
n = 10
number = n
cardinals = c
location = loc
setup = 1
proc/attach(atom/atom)
holder = atom
proc/start()
/////////////////////////////////////////////
// GENERIC STEAM SPREAD SYSTEM
@@ -86,22 +108,15 @@ 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)
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()
start()
var/i = 0
for(i=0, i<src.number, i++)
spawn(0)
@@ -119,12 +134,6 @@ steam.start() -- spawns the effect
spawn(20)
del(steam)
/////////////////////////////////////////////
//SPARK SYSTEM (like steam system)
// The attach(atom/atom) proc is optional, and can be called to attach the effect
@@ -164,13 +173,9 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/spark_spread
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/total_sparks = 0 // To stop it being spammed and lagging!
/datum/effect/effect/system/spark_spread/proc/set_up(n = 3, c = 0, loca)
set_up(n = 3, c = 0, loca)
if(n > 10)
n = 10
number = n
@@ -180,10 +185,7 @@ steam.start() -- spawns the effect
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()
start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_sparks > 20)
@@ -207,11 +209,6 @@ steam.start() -- spawns the effect
/////////////////////////////////////////////
//// SMOKE SYSTEMS
// direct can be optinally added when set_up, to make the smoke always travel in one direction
@@ -242,14 +239,10 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/harmless_smoke_spread
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/total_smoke = 0 // To stop it being spammed and lagging!
var/direction
/datum/effect/effect/system/harmless_smoke_spread/proc/set_up(n = 5, c = 0, loca, direct)
set_up(n = 5, c = 0, loca, direct)
if(n > 10)
n = 10
number = n
@@ -262,10 +255,7 @@ steam.start() -- spawns the effect
direction = direct
/datum/effect/effect/system/harmless_smoke_spread/proc/attach(atom/atom)
holder = atom
/datum/effect/effect/system/harmless_smoke_spread/proc/start()
start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_smoke > 20)
@@ -289,11 +279,6 @@ steam.start() -- spawns the effect
src.total_smoke--
/////////////////////////////////////////////
// Bad smoke
/////////////////////////////////////////////
@@ -355,14 +340,10 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/bad_smoke_spread
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/total_smoke = 0 // To stop it being spammed and lagging!
var/direction
/datum/effect/effect/system/bad_smoke_spread/proc/set_up(n = 5, c = 0, loca, direct)
set_up(n = 5, c = 0, loca, direct)
if(n > 20)
n = 20
number = n
@@ -374,11 +355,7 @@ steam.start() -- spawns the effect
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()
start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_smoke > 20)
@@ -442,13 +419,10 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/chem_smoke_spread
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/total_smoke = 0 // To stop it being spammed and lagging!
var/direction
var/obj/chemholder
New()
..()
chemholder = new/obj()
@@ -456,7 +430,7 @@ steam.start() -- spawns the effect
chemholder.reagents = R
R.my_atom = chemholder
/datum/effect/effect/system/chem_smoke_spread/proc/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct)
set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct)
if(n > 20)
n = 20
number = n
@@ -470,11 +444,7 @@ steam.start() -- spawns the effect
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()
start()
var/i = 0
// Calculate the smokes' color
@@ -587,14 +557,10 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/sleep_smoke_spread
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/total_smoke = 0 // To stop it being spammed and lagging!
var/direction
/datum/effect/effect/system/sleep_smoke_spread/proc/set_up(n = 5, c = 0, loca, direct)
set_up(n = 5, c = 0, loca, direct)
if(n > 20)
n = 20
number = n
@@ -607,10 +573,7 @@ steam.start() -- spawns the effect
direction = direct
/datum/effect/effect/system/sleep_smoke_spread/proc/attach(atom/atom)
holder = atom
/datum/effect/effect/system/sleep_smoke_spread/proc/start()
start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_smoke > 20)
@@ -681,14 +644,10 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/mustard_gas_spread
var/number = 3
var/cardinals = 0
var/turf/location
var/atom/holder
var/total_smoke = 0 // To stop it being spammed and lagging!
var/direction
/datum/effect/effect/system/mustard_gas_spread/proc/set_up(n = 5, c = 0, loca, direct)
set_up(n = 5, c = 0, loca, direct)
if(n > 20)
n = 20
number = n
@@ -700,10 +659,7 @@ steam.start() -- spawns the effect
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()
start()
var/i = 0
for(i=0, i<src.number, i++)
if(src.total_smoke > 20)
@@ -728,8 +684,6 @@ steam.start() -- spawns the effect
/////////////////////////////////////////////
//////// Attach an Ion trail to any object, that spawns when it moves (like for the jetpack)
/// just pass in the object to attach it to in set_up
@@ -743,16 +697,15 @@ steam.start() -- spawns the effect
anchored = 1.0
/datum/effect/effect/system/ion_trail_follow
var/atom/holder
var/turf/oldposition
var/processing = 1
var/on = 1
/datum/effect/effect/system/ion_trail_follow/proc/set_up(atom/atom)
holder = atom
set_up(atom/atom)
attach(atom)
oldposition = get_turf(atom)
/datum/effect/effect/system/ion_trail_follow/proc/start()
start()
if(!src.on)
src.on = 1
src.processing = 1
@@ -779,31 +732,28 @@ steam.start() -- spawns the effect
src.processing = 1
src.start()
/datum/effect/effect/system/ion_trail_follow/proc/stop()
proc/stop()
src.processing = 0
src.on = 0
/////////////////////////////////////////////
//////// Attach a steam trail to an object (eg. a reacting beaker) that will follow it
// even if it's carried of thrown.
/////////////////////////////////////////////
/datum/effect/effect/system/steam_trail_follow
var/atom/holder
var/turf/oldposition
var/processing = 1
var/on = 1
var/number
/datum/effect/effect/system/steam_trail_follow/proc/set_up(atom/atom)
holder = atom
set_up(atom/atom)
attach(atom)
oldposition = get_turf(atom)
/datum/effect/effect/system/steam_trail_follow/proc/start()
start()
if(!src.on)
src.on = 1
src.processing = 1
@@ -828,7 +778,7 @@ steam.start() -- spawns the effect
src.processing = 1
src.start()
/datum/effect/effect/system/steam_trail_follow/proc/stop()
proc/stop()
src.processing = 0
src.on = 0
@@ -940,14 +890,13 @@ steam.start() -- spawns the effect
/datum/effect/effect/system/foam_spread
var/amount = 5 // the size of the foam spread.
var/turf/location
var/list/carried_reagents // the IDs of reagents present when the foam was mixed
var/metal = 0 // 0=foam, 1=metalfoam, 2=ironfoam
/datum/effect/effect/system/foam_spread/proc/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metalfoam = 0)
set_up(amt=5, loca, var/datum/reagents/carry = null, var/metalfoam = 0)
amount = round(amt/5, 1)
if(istype(loca, /turf/))
location = loca
@@ -967,7 +916,7 @@ steam.start() -- spawns the effect
for(var/datum/reagent/R in carry.reagent_list)
carried_reagents += R.id
/datum/effect/effect/system/foam_spread/proc/start()
start()
spawn(0)
var/obj/effect/effect/foam/F = locate() in location
if(F)
@@ -1066,9 +1015,9 @@ steam.start() -- spawns the effect
else
user << "\blue You hit the metal foam to no effect."
// only air group geometry can pass
CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
return air_group
if(air_group) return 0
return !density
// shouldn't this be a general procedure?
@@ -1119,11 +1068,10 @@ steam.start() -- spawns the effect
/datum/effect/effect/system/reagents_explosion
var/amount // TNT equivalent
var/turf/location
var/flashing = 0 // does explosion creates flash effect?
var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion
/datum/effect/effect/system/reagents_explosion/proc/set_up (amt, loc, flash = 0, flash_fact = 0)
set_up (amt, loc, flash = 0, flash_fact = 0)
amount = amt
if(istype(loc, /turf/))
location = loc
@@ -1135,7 +1083,7 @@ steam.start() -- spawns the effect
return
/datum/effect/effect/system/reagents_explosion/proc/start()
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)

View File

@@ -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///////
////////////////////////////////////////

View File

@@ -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)

View File

@@ -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. -->
<b><font color='blue'>29 October 2011</font><b>
<ul>
<li><b>ConstantA updated:</b>
<ul>
<li>Added step and turn sounds for mechs</li>
<li>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.</li>
<li>Added mecha laser cannon.</li>
<li>Added damage absorption for mechs. Different mechs have different absorption for different types of damage.</li>
<li>Metal foam now blocks air movement.</li>
</ul>
</li>
</ul>
<b><font color='blue'>29 October 2011</font><b>
<ul>
<li><b>Petethegoat updated:</b>

BIN
sound/mecha/mechmove01.ogg Normal file

Binary file not shown.

BIN
sound/mecha/mechmove03.ogg Normal file

Binary file not shown.

BIN
sound/mecha/mechmove04.ogg Normal file

Binary file not shown.

BIN
sound/mecha/mechstep.ogg Normal file

Binary file not shown.

BIN
sound/mecha/mechturn.ogg Normal file

Binary file not shown.

View File

@@ -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"