mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-27 14:07:51 +01:00
This is a rather big mecha update (not everything is polished, bughunt in progress).
- Mechs equipment is customizable (you can add different equipment to mechs). Weapons go to combat mechs only, clown mech equipment - to HONK only. Clamp goes only to Ripley. - Mech equipment can be built by mech fabricator. - Added mecha RCD, mecha teleporter, mecha wormhole generator equipment. - Equipment(if any left) can be pried from mecha wreckage with crowbar. - Mech control console circuitboard added to circuit storage. - Mechs can teleport from teleport hub. - Fixed ripley cargo problems with moving objects(bots, carps, huggers etc). Loading hostile organisms may be harmful. Be vigilant. - Fixed bug with many mobs climbing inside one mecha. - Fixed mecha "unable-to-move" message spam. Other things: - Rooms in random asteroids for extended and sandbox (WIP) - Misc. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1190 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -121,6 +121,8 @@ proc
|
||||
var/PriorityQueue/open = new /PriorityQueue(/proc/PathWeightCompare)
|
||||
var/closed[] = new()
|
||||
var/path[]
|
||||
start = get_turf(start)
|
||||
if(!start) return 0
|
||||
|
||||
open.Enqueue(new /PathNode(start,null,0,call(start,dist)(end)))
|
||||
|
||||
|
||||
@@ -81,3 +81,29 @@
|
||||
|
||||
//turfs += centerturf
|
||||
return turfs
|
||||
|
||||
/proc/circlerangeturfs(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/turf/T in range(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
return turfs
|
||||
|
||||
/proc/circleviewturfs(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/turf/T in view(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
return turfs
|
||||
@@ -8,8 +8,9 @@ proc/spawn_asteroid(var/atom/start_loc,var/type,var/size,var/richness)//type: 0
|
||||
if(!richness)
|
||||
richness = rand(10,40)
|
||||
// world << "Asteroid size: [size]; Asteroid type: [type]"
|
||||
var/list/turfs = circlerange(start_loc,size)
|
||||
var/list/turfs = circlerangeturfs(start_loc,size)
|
||||
var/area/asteroid/AstAr = new
|
||||
AstAr.name = "Asteroid #[start_loc.x][start_loc.y][start_loc.z]"
|
||||
for(var/turf/T in turfs)
|
||||
var/dist = get_dist(start_loc,T)
|
||||
if(abs(GaussRand(dist))<size) //prob(100-(dist*rand(2,4))))//I'm terrible at generating random things.
|
||||
@@ -25,17 +26,17 @@ proc/spawn_asteroid(var/atom/start_loc,var/type,var/size,var/richness)//type: 0
|
||||
A.opacity = 0
|
||||
A.sd_NewOpacity(1)
|
||||
AstAr.contents += A
|
||||
/*
|
||||
if(max_secret_rooms && size == 12)
|
||||
var/x_len = rand(4,12)
|
||||
var/y_len = pick(4,12)
|
||||
|
||||
if(max_secret_rooms && size >= 10)
|
||||
var/x_len = rand(4,size)
|
||||
var/y_len = pick(4,size)
|
||||
var/st_l = locate(start_loc.x-round(x_len/2),start_loc.y-round(y_len/2),start_loc.z)
|
||||
spawn_room(st_l,x_len,y_len)
|
||||
max_secret_rooms--
|
||||
*/
|
||||
|
||||
return 1
|
||||
|
||||
/proc/populate_w_asteroids(var/z,var/density)
|
||||
/proc/populate_w_asteroids(var/z,var/density=null)
|
||||
if(!density)
|
||||
density = pick(10,20,40)
|
||||
while(density)
|
||||
@@ -96,9 +97,9 @@ proc/spawn_asteroid(var/atom/start_loc,var/type,var/size,var/richness)//type: 0
|
||||
proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor)
|
||||
var/list/room_turfs = list("walls"=list(),"floors"=list())
|
||||
|
||||
world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]"
|
||||
//world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]"
|
||||
if(!wall)
|
||||
wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall)
|
||||
wall = pick(/turf/simulated/wall/r_wall,/turf/simulated/wall,/obj/alien/resin)
|
||||
if(!floor)
|
||||
floor = pick(/turf/simulated/floor,/turf/simulated/floor/engine)
|
||||
|
||||
@@ -141,7 +142,18 @@ proc/admin_spawn_room_at_pos()
|
||||
spawn_room(locate(x,y,z),x_len,y_len,wall,floor)
|
||||
return
|
||||
|
||||
var/global/list/space_surprises = list(/obj/alien/facehugger,
|
||||
/obj/livestock/spesscarp,
|
||||
/obj/livestock/spesscarp/elite,
|
||||
/obj/creature,
|
||||
/obj/item/weapon/rcd,
|
||||
/obj/item/weapon/rcd_ammo,
|
||||
/obj/item/weapon/spacecash,
|
||||
/obj/item/weapon/cloaking_device,
|
||||
/obj/item/weapon/gun/energy/teleport_gun,
|
||||
/obj/item/weapon/rubber_chicken,
|
||||
/obj/item/weapon/sword/pirate
|
||||
)
|
||||
|
||||
|
||||
|
||||
var/global/max_secret_rooms = 3
|
||||
var/global/max_secret_rooms = 6
|
||||
|
||||
@@ -65,6 +65,8 @@ rcd light flash thingy on matter drain
|
||||
rcdmod.uses --
|
||||
for(var/obj/item/weapon/rcd/rcd in world)
|
||||
rcd.disabled = 1
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/tool/rcd/rcd in world)
|
||||
rcd.disabled = 1
|
||||
usr << "RCD-disabling pulse emitted."
|
||||
else usr << "Out of uses."
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
/obj/mecha/combat
|
||||
deflect_chance = 10
|
||||
health = 500
|
||||
|
||||
var/list/weapons = new
|
||||
var/datum/mecha_weapon/selected_weapon
|
||||
operation_req_access = list(access_security)
|
||||
internals_req_access = list(access_engine,access_robotics)
|
||||
var/force = 25
|
||||
@@ -33,12 +30,14 @@
|
||||
return
|
||||
*/
|
||||
|
||||
/*
|
||||
/obj/mecha/combat/range_action(target as obj|mob|turf)
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
target = pick(view(3,target))
|
||||
if(selected_weapon)
|
||||
selected_weapon.fire(target)
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/mecha/combat/melee_action(target as obj|mob|turf)
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
@@ -115,7 +114,7 @@
|
||||
V.show_message("[src.name] hits [target].", 1)
|
||||
if(!istype(target, /turf/simulated/wall))
|
||||
target:attackby(src,src.occupant)
|
||||
else if(prob(5))
|
||||
else if(prob(20))
|
||||
target:dismantle_wall(1)
|
||||
src.occupant_message("\blue You smash through the wall.")
|
||||
src.visible_message("<b>[src.name] smashes through the wall</b>")
|
||||
@@ -153,17 +152,9 @@
|
||||
|
||||
return 0
|
||||
*/
|
||||
/obj/mecha/combat/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["select_weapon"])
|
||||
var/weapon = locate(href_list["select_weapon"])
|
||||
if(weapon)
|
||||
src.selected_weapon = weapon
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/combat/moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
if(..(H))
|
||||
if(..())
|
||||
if(usr.client)
|
||||
usr.client.mouse_pointer_icon = file("icons/misc/mecha_mouse.dmi")
|
||||
return 1
|
||||
@@ -176,26 +167,12 @@
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/combat/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)
|
||||
..()
|
||||
if(prob(5) && (ignore_threshold || (src.health*100/initial(src.health))<src.internal_damage_threshold))
|
||||
if(weapons.len)
|
||||
var/datum/mecha_weapon/destr_weapon = pick(weapons)
|
||||
if(destr_weapon)
|
||||
weapons -= destr_weapon
|
||||
destr_weapon.destroy()
|
||||
src.occupant_message("<font color='red'>The [destr_weapon] is destroyed!</font>")
|
||||
src.log_append_to_last("[destr_weapon] is destoyed.",1)
|
||||
src.occupant << sound('weapdestr.ogg',volume=50)
|
||||
return
|
||||
|
||||
/obj/mecha/combat/get_stats_part()
|
||||
var/output = ..()
|
||||
output += "<b>Weapon systems:</b><div style=\"margin-left: 15px;\">"
|
||||
if(weapons.len)
|
||||
for(var/datum/mecha_weapon/W in weapons)
|
||||
output += "[selected_weapon==W?"<b>":"<a href='?src=\ref[src];select_weapon=\ref[W]'>"][W.get_weapon_info()][selected_weapon==W?"</b>":"</a>"]<br>"
|
||||
if(equipment.len)
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/W in equipment)
|
||||
output += "[selected==W?"<b>":"<a href='?src=\ref[src];select_equip=\ref[W]'>"][W.get_equip_info()][selected==W?"</b>":"</a>"]<br>"
|
||||
else
|
||||
output += "None"
|
||||
output += "</div>"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "durand"
|
||||
step_in = 6
|
||||
health = 350
|
||||
deflect_chance = 12
|
||||
deflect_chance = 15
|
||||
max_temperature = 3000
|
||||
infra_luminosity = 8
|
||||
operation_req_access = list(access_security)
|
||||
@@ -13,17 +13,20 @@
|
||||
var/defence_deflect = 30
|
||||
wreckage = "/obj/decal/mecha_wreckage/durand"
|
||||
|
||||
|
||||
/*
|
||||
/obj/mecha/combat/durand/New()
|
||||
..()
|
||||
weapons += new /datum/mecha_weapon/ballistic/lmg(src)
|
||||
weapons += new /datum/mecha_weapon/ballistic/scattershot(src)
|
||||
selected_weapon = weapons[1]
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/mecha/combat/durand/relaymove(mob/user,direction)
|
||||
if(defence)
|
||||
src.occupant_message("<font color='red'>Unable to move while in defence mode</font>")
|
||||
if(world.time - last_message > 20)
|
||||
src.occupant_message("<font color='red'>Unable to move while in defence mode</font>")
|
||||
last_message = world.time
|
||||
return 0
|
||||
. = ..()
|
||||
return
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
operation_req_access = list(access_security)
|
||||
wreckage = "/obj/decal/mecha_wreckage/gygax"
|
||||
|
||||
/*
|
||||
/obj/mecha/combat/gygax/New()
|
||||
..()
|
||||
weapons += new /datum/mecha_weapon/taser(src)
|
||||
@@ -18,6 +19,7 @@
|
||||
weapons += new /datum/mecha_weapon/missile_rack/flashbang(src)
|
||||
selected_weapon = weapons[1]
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/mecha/combat/gygax/verb/overload()
|
||||
set category = "Exosuit Interface"
|
||||
|
||||
@@ -12,20 +12,20 @@
|
||||
|
||||
/obj/mecha/combat/honker/New()
|
||||
..()
|
||||
/*
|
||||
weapons += new /datum/mecha_weapon/honker(src)
|
||||
weapons += new /datum/mecha_weapon/missile_rack/banana_mortar(src)
|
||||
weapons += new /datum/mecha_weapon/missile_rack/mousetrap_mortar(src)
|
||||
selected_weapon = weapons[1]
|
||||
return
|
||||
*/
|
||||
|
||||
|
||||
/obj/mecha/combat/honker/melee_action(target)
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
target = pick(oview(1,src))
|
||||
if(!melee_can_hit || !istype(target, /atom))
|
||||
return
|
||||
if(istype(selected_weapon, /datum/mecha_weapon/honker))
|
||||
selected_weapon.fire(target)
|
||||
if(istype(selected, /obj/item/mecha_parts/mecha_equipment/weapon/honker))
|
||||
selected.action(target)
|
||||
else if(istype(target, /mob))
|
||||
step_away(target,src,15)
|
||||
return
|
||||
@@ -43,9 +43,9 @@
|
||||
<b>Lights: </b>[lights?"on":"off"]<br>
|
||||
"}
|
||||
output += "<b>HONKon systems:</b><div style=\"margin-left: 15px;\">"
|
||||
if(weapons.len)
|
||||
for(var/datum/mecha_weapon/W in weapons)
|
||||
output += "[selected_weapon==W?"<b>":"<a href='?src=\ref[src];select_weapon=\ref[W]'>"][W.get_weapon_info()][selected_weapon==W?"</b>":"</a>"]<br>"
|
||||
if(equipment.len)
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/W in equipment)
|
||||
output += "[selected==W?"<b>":"<a href='?src=\ref[src];select_equip=\ref[W]'>"][W.get_equip_info()][selected==W?"</b>":"</a>"]<br>"
|
||||
else
|
||||
output += "None. HONK!"
|
||||
output += "</div>"
|
||||
|
||||
@@ -19,9 +19,10 @@
|
||||
|
||||
/obj/mecha/combat/marauder/New()
|
||||
..()
|
||||
weapons += new /datum/mecha_weapon/pulse(src)
|
||||
weapons += new /datum/mecha_weapon/missile_rack(src)
|
||||
selected_weapon = weapons[1]
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/pulse
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
ME.attach(src)
|
||||
src.smoke_system.set_up(3, 0, src)
|
||||
src.smoke_system.attach(src)
|
||||
return
|
||||
@@ -30,10 +31,14 @@
|
||||
if(!can_move)
|
||||
return 0
|
||||
if(zoom)
|
||||
src.occupant_message("Unable to move while in zoom mode.")
|
||||
if(world.time - last_message > 20)
|
||||
src.occupant_message("Unable to move while in zoom mode.")
|
||||
last_message = world.time
|
||||
return 0
|
||||
if(connected_port)
|
||||
src.occupant_message("Unable to move while connected to the air system port")
|
||||
if(world.time - last_message > 20)
|
||||
src.occupant_message("Unable to move while connected to the air system port")
|
||||
last_message = world.time
|
||||
return 0
|
||||
if(!thrusters && src.pr_inertial_movement.active())
|
||||
return 0
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
//TODO: Add critfail checks and reliability
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment
|
||||
name = "mecha equipment"
|
||||
icon = 'mech_construct.dmi'
|
||||
icon_state = "mecha_equip"
|
||||
force = 5
|
||||
construction_time = 100
|
||||
construction_cost = list("metal"=10000)
|
||||
var/equip_cooldown = 0
|
||||
var/equip_ready = 1
|
||||
var/energy_drain = 0
|
||||
var/obj/mecha/chassis = null
|
||||
var/ranged = 0
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown()
|
||||
sleep(equip_cooldown)
|
||||
if(src && chassis)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/New()
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/destroy()//missiles detonating, teleporter creating singularity?
|
||||
spawn
|
||||
del src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/get_equip_info()
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not?
|
||||
return ranged
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target)
|
||||
if(!target)
|
||||
return 0
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/mecha/M as obj)
|
||||
if(istype(M))
|
||||
if(M.equipment.len<M.max_equip)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/mecha/M as obj)
|
||||
M.equipment += src
|
||||
src.chassis = M
|
||||
src.loc = M
|
||||
M.log_message("[src] initialized.")
|
||||
if(!M.selected)
|
||||
M.selected = src
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/combat))
|
||||
return 1
|
||||
return 0
|
||||
@@ -0,0 +1,337 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
name = "Hydraulic Clamp"
|
||||
icon_state = "mecha_clamp"
|
||||
equip_cooldown = 15
|
||||
energy_drain = 10
|
||||
var/dam_force = 20
|
||||
var/obj/mecha/working/ripley/cargo_holder
|
||||
|
||||
can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
attach(obj/mecha/M as obj)
|
||||
..()
|
||||
cargo_holder = M
|
||||
return
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(!cargo_holder) return
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(!O.anchored)
|
||||
if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
|
||||
chassis.occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
equip_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
if(do_after_cooldown())
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.anchored = 0
|
||||
/*
|
||||
if(istype(O, /obj/machinery/bot))// That's shit-code right here, folks.
|
||||
O:on = 0
|
||||
*/
|
||||
chassis.occupant_message("<font color='blue'>[target] succesfully loaded.</font>")
|
||||
chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
else
|
||||
chassis.occupant_message("<font color='red'>You must hold still while handling objects.</font>")
|
||||
O.anchored = initial(O.anchored)
|
||||
equip_ready = 1
|
||||
|
||||
else
|
||||
chassis.occupant_message("<font color='red'>Not enough room in cargo compartment.</font>")
|
||||
else
|
||||
chassis.occupant_message("<font color='red'>[target] is firmly secured.</font>")
|
||||
|
||||
else if(istype(target,/mob))
|
||||
var/mob/M = target
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == "hurt")
|
||||
M.bruteloss += dam_force
|
||||
M.oxyloss += round(dam_force/2)
|
||||
M.updatehealth()
|
||||
chassis.occupant_message("\red You squeese [target] with [src.name]. Something cracks.")
|
||||
chassis.visible_message("\red [chassis] squeeses [target].")
|
||||
else
|
||||
step_away(M,chassis)
|
||||
chassis.occupant_message("You push [target] out of the way.")
|
||||
chassis.visible_message("[chassis] pushes [target] out of the way.")
|
||||
equip_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
spawn(equip_cooldown)
|
||||
equip_ready = 1
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill
|
||||
name = "Drill"
|
||||
icon_state = "mecha_drill"
|
||||
equip_cooldown = 40
|
||||
energy_drain = 20
|
||||
force = 15
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
equip_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
chassis.visible_message("<font color='red'><b>[chassis] starts to drill [target]</b></font>", "You hear the drill.")
|
||||
chassis.occupant_message("<font color='red'><b>You start to drill [target]</b></font>")
|
||||
var/T = chassis.loc
|
||||
if(do_after_cooldown())
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall/r_wall))
|
||||
chassis.occupant_message("<font color='red'>[target] is too durable to drill through.</font>")
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
var/turf/simulated/mineral/M = target
|
||||
chassis.log_message("Drilled through [target]")
|
||||
M.gets_drilled()
|
||||
for(var/turf/simulated/mineral/N in range(chassis,1))
|
||||
if(get_dir(chassis,N)&chassis.dir)
|
||||
N.gets_drilled()
|
||||
else
|
||||
chassis.log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
equip_ready = 1
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher
|
||||
name = "Extinguisher"
|
||||
icon_state = "mecha_exting"
|
||||
equip_cooldown = 5
|
||||
energy_drain = 0
|
||||
|
||||
New()
|
||||
reagents = new/datum/reagents(200)
|
||||
reagents.my_atom = src
|
||||
reagents.add_reagent("water", 200)
|
||||
..()
|
||||
return
|
||||
|
||||
action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch.
|
||||
if(!action_checks(target)) return
|
||||
if(get_dist(chassis, target)>2) return
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
if(istype(target, /obj/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
|
||||
var/obj/o = target
|
||||
o.reagents.trans_to(src, 200)
|
||||
chassis.occupant_message("\blue Extinguisher refilled")
|
||||
playsound(chassis, 'refill.ogg', 50, 1, -6)
|
||||
else
|
||||
if(src.reagents.total_volume > 0)
|
||||
playsound(chassis, 'extinguish.ogg', 75, 1, -3)
|
||||
var/direction = get_dir(chassis,target)
|
||||
var/turf/T = get_turf(target)
|
||||
var/turf/T1 = get_step(T,turn(direction, 90))
|
||||
var/turf/T2 = get_step(T,turn(direction, -90))
|
||||
|
||||
var/list/the_targets = list(T,T1,T2)
|
||||
for(var/a=0, a<5, a++)
|
||||
spawn(0)
|
||||
var/obj/effects/water/W = new /obj/effects/water(get_turf(chassis))
|
||||
if(!W)
|
||||
return
|
||||
var/turf/my_target = pick(the_targets)
|
||||
var/datum/reagents/R = new/datum/reagents(5)
|
||||
W.reagents = R
|
||||
R.my_atom = W
|
||||
src.reagents.trans_to(W,1)
|
||||
for(var/b=0, b<5, b++)
|
||||
if(!W)
|
||||
return
|
||||
step_towards(W,my_target)
|
||||
if(!W)
|
||||
return
|
||||
var/turf/W_turf = get_turf(W)
|
||||
W.reagents.reaction(W_turf)
|
||||
for(var/atom/atm in W_turf)
|
||||
W.reagents.reaction(atm)
|
||||
if(W.loc == my_target)
|
||||
break
|
||||
sleep(2)
|
||||
return 1
|
||||
|
||||
get_equip_info()
|
||||
return "[..()] \[[src.reagents.total_volume]\]"
|
||||
|
||||
on_reagent_change()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd
|
||||
name = "Mounted RCD"
|
||||
icon_state = "mecha_rcd"
|
||||
equip_cooldown = 20
|
||||
energy_drain = 250
|
||||
ranged = 1
|
||||
construction_time = 1200
|
||||
construction_cost = list("metal"=50000,"plasma"=40000,"silver"=30000,"gold"=20000)
|
||||
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
|
||||
var/disabled = 0 //malf
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target) || disabled || get_dist(chassis, target)>3) return
|
||||
playsound(src.loc, 'click.ogg', 50, 1)
|
||||
//meh
|
||||
switch(mode)
|
||||
if(0)
|
||||
if (istype(target, /turf/simulated/wall))
|
||||
chassis.occupant_message("Deconstructing [target]...")
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
target:ReplaceWithFloor()
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
equip_ready = 1
|
||||
chassis.cell.give(energy_drain)
|
||||
else if (istype(target, /turf/simulated/floor))
|
||||
chassis.occupant_message("Deconstructing [target]...")
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
target:ReplaceWithSpace()
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
equip_ready = 1
|
||||
chassis.cell.give(energy_drain)
|
||||
else if (istype(target, /obj/machinery/door/airlock))
|
||||
chassis.occupant_message("Deconstructing [target]...")
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
del(target)
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
equip_ready = 1
|
||||
chassis.cell.give(energy_drain)
|
||||
if(1)
|
||||
if(istype(target, /turf/space))
|
||||
chassis.occupant_message("Building Floor...")
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
if(disabled) return
|
||||
target:ReplaceWithFloor()
|
||||
playsound(chassis.loc, 'Deconstruct.ogg', 50, 1)
|
||||
chassis.spark_system.start()
|
||||
equip_ready = 1
|
||||
chassis.cell.use(energy_drain*3)
|
||||
else if(istype(target, /turf/simulated/floor))
|
||||
chassis.occupant_message("Building Wall...")
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
if(disabled) return
|
||||
target:ReplaceWithWall()
|
||||
playsound(chassis.loc, 'Deconstruct.ogg', 50, 1)
|
||||
chassis.spark_system.start()
|
||||
equip_ready = 1
|
||||
chassis.cell.use(energy_drain*3)
|
||||
if(2)
|
||||
if(istype(target, /turf/simulated/floor))
|
||||
chassis.occupant_message("Building Airlock...")
|
||||
equip_ready = 0
|
||||
if(do_after_cooldown())
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target)
|
||||
T.autoclose = 1
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
playsound(src.loc, 'sparks2.ogg', 50, 1)
|
||||
equip_ready = 1
|
||||
chassis.cell.use(energy_drain*3)
|
||||
return
|
||||
|
||||
|
||||
Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
switch(mode)
|
||||
if(0)
|
||||
chassis.occupant_message("Swithed RCD to Deconstruct.")
|
||||
if(1)
|
||||
chassis.occupant_message("Swithed RCD to Construct.")
|
||||
if(2)
|
||||
chassis.occupant_message("Swithed RCD to Construct Airlock.")
|
||||
return
|
||||
|
||||
get_equip_info()
|
||||
return "[..()] \[<a href='?src=\ref[src];mode=0'>D</a>|<a href='?src=\ref[src];mode=1'>C</a>|<a href='?src=\ref[src];mode=2'>A</a>\]"
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
name = "Teleporter"
|
||||
icon_state = "mecha_teleport"
|
||||
equip_cooldown = 300
|
||||
energy_drain = 1000
|
||||
ranged = 1
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
equip_ready = 0
|
||||
do_teleport(chassis, T, 4)
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/wormhole_generator
|
||||
name = "Wormhole Generator"
|
||||
icon_state = "mecha_teleport"
|
||||
equip_cooldown = 50
|
||||
energy_drain = 300
|
||||
ranged = 1
|
||||
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/list/theareas = list()
|
||||
for(var/area/AR in orange(100, chassis))
|
||||
if(AR in theareas) continue
|
||||
theareas += AR
|
||||
if(!theareas.len)
|
||||
return
|
||||
var/area/thearea = pick(theareas)
|
||||
var/list/L = list()
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
if(!T.density)
|
||||
var/clear = 1
|
||||
for(var/obj/O in T)
|
||||
if(O.density)
|
||||
clear = 0
|
||||
break
|
||||
if(clear)
|
||||
L+=T
|
||||
if(!L.len)
|
||||
return
|
||||
var/turf/target_turf = pick(L)
|
||||
if(!target_turf)
|
||||
return
|
||||
chassis.cell.use(energy_drain)
|
||||
equip_ready = 0
|
||||
var/obj/portal/P = new /obj/portal(get_turf(target))
|
||||
P.target = target_turf
|
||||
P.creator = null
|
||||
P.icon = 'objects.dmi'
|
||||
P.failchance = 0
|
||||
P.icon_state = "anom"
|
||||
P.name = "wormhole"
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
src = null
|
||||
spawn(rand(150,300))
|
||||
del(P)
|
||||
return
|
||||
+191
-206
@@ -1,136 +1,30 @@
|
||||
/datum/mecha_weapon
|
||||
var/name = "mecha weapon"
|
||||
var/weapon_cooldown = 0
|
||||
var/weapon_ready = 1
|
||||
var/energy_drain = 0
|
||||
var/obj/mecha/combat/chassis = null
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon
|
||||
name = "mecha weapon"
|
||||
ranged = 1
|
||||
origin_tech = "materials=3;combat=3"
|
||||
|
||||
|
||||
/datum/mecha_weapon/New(mecha)
|
||||
if(!istype(mecha, /obj/mecha/combat))
|
||||
return
|
||||
src.chassis = mecha
|
||||
chassis.log_append_to_last("[src.name] initialized.")
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/combat))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/mecha_weapon/proc/destroy()
|
||||
spawn
|
||||
del src
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_weapon/proc/get_weapon_info()
|
||||
return src.name
|
||||
|
||||
|
||||
/datum/mecha_weapon/proc/fire_checks(target) //general checks.
|
||||
if(!target)
|
||||
return 0
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!weapon_ready)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/mecha_weapon/proc/fire(target)
|
||||
return fire_checks(target)
|
||||
|
||||
|
||||
|
||||
/datum/mecha_weapon/missile_rack //TODO: move missile racks to ballistic class
|
||||
name = "SRM-8 Missile Rack"
|
||||
var/missiles = 8
|
||||
var/missile_speed = 2
|
||||
var/missile_range = 30
|
||||
var/missile_energy_cost = 1000
|
||||
weapon_cooldown = 60
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target) || missiles <=0) return
|
||||
weapon_ready = 0
|
||||
var/obj/item/missile/M = new /obj/item/missile(chassis.loc)
|
||||
M.primed = 1
|
||||
playsound(chassis, 'bang.ogg', 50, 1)
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
missiles--
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
return
|
||||
|
||||
proc/rearm()
|
||||
if(missiles < initial(missiles))
|
||||
var/missiles_to_add = initial(missiles) - missiles
|
||||
while(chassis.get_charge() >= missile_energy_cost && missiles_to_add)
|
||||
missiles++
|
||||
missiles_to_add--
|
||||
chassis.cell.use(missile_energy_cost)
|
||||
chassis.log_message("Rearmed [src.name].")
|
||||
return
|
||||
|
||||
get_weapon_info()
|
||||
return "[src.name]\[[src.missiles]\][(src.missiles < initial(src.missiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
|
||||
Topic(href, href_list)
|
||||
if (href_list["rearm"])
|
||||
src.rearm()
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/missile
|
||||
icon = 'grenade.dmi'
|
||||
icon_state = "flashbang"
|
||||
var/primed = null
|
||||
throwforce = 15
|
||||
|
||||
throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4)
|
||||
del(src)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/mecha_weapon/missile_rack/flashbang
|
||||
name = "SGL-6 Grenade Launcher"
|
||||
missiles = 6
|
||||
missile_speed = 1.5
|
||||
missile_energy_cost = 800
|
||||
weapon_cooldown = 60
|
||||
var/det_time = 20
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target) || missiles <=0) return
|
||||
weapon_ready = 0
|
||||
var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(chassis.loc)
|
||||
playsound(chassis, 'bang.ogg', 50, 1)
|
||||
F.throw_at(target, missile_range, missile_speed)
|
||||
missiles--
|
||||
spawn(det_time)
|
||||
F.prime()
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
return
|
||||
|
||||
/datum/mecha_weapon/laser
|
||||
weapon_cooldown = 10
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/laser
|
||||
equip_cooldown = 10
|
||||
name = "CH-PS \"Immolator\" Laser"
|
||||
icon_state = "mecha_laser"
|
||||
energy_drain = 30
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target)) return
|
||||
|
||||
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
|
||||
weapon_ready = 0
|
||||
equip_ready = 0
|
||||
playsound(chassis, 'Laser.ogg', 50, 1)
|
||||
var/obj/beam/a_laser/A = new /obj/beam/a_laser(curloc)
|
||||
A.current = curloc
|
||||
@@ -138,19 +32,20 @@
|
||||
A.xo = targloc.x - curloc.x
|
||||
chassis.cell.use(energy_drain)
|
||||
A.process()
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_weapon/pulse
|
||||
weapon_cooldown = 30
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/pulse
|
||||
equip_cooldown = 30
|
||||
name = "eZ-13 mk2 Heavy pulse rifle"
|
||||
icon_state = "mecha_pulse"
|
||||
energy_drain = 120
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target)) return
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
|
||||
var/turf/curloc = chassis.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
@@ -164,12 +59,12 @@
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
weapon_ready = 0
|
||||
equip_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
A.process()
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
@@ -183,14 +78,14 @@
|
||||
src.life -= 10
|
||||
return
|
||||
|
||||
/datum/mecha_weapon/taser
|
||||
weapon_cooldown = 10
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/taser
|
||||
name = "PBT \"Pacifier\" Mounted Taser"
|
||||
icon_state = "mecha_taser"
|
||||
energy_drain = 20
|
||||
weapon_cooldown = 7
|
||||
equip_cooldown = 7
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target)) return
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
|
||||
var/turf/curloc = chassis.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
@@ -204,70 +99,37 @@
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
weapon_ready = 0
|
||||
equip_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
spawn()
|
||||
A.process()
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
/datum/mecha_weapon/missile_rack/banana_mortar
|
||||
name = "Banana Mortar"
|
||||
missiles = 15
|
||||
missile_speed = 1.5
|
||||
missile_energy_cost = 100
|
||||
weapon_cooldown = 20
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target) || missiles <=0) return
|
||||
weapon_ready = 0
|
||||
var/obj/item/weapon/bananapeel/B = new /obj/item/weapon/bananapeel(chassis.loc)
|
||||
playsound(chassis, 'bikehorn.ogg', 60, 1)
|
||||
B.throw_at(target, missile_range, missile_speed)
|
||||
missiles--
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Bananed from [src.name], targeting [target]. HONK!")
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_weapon/missile_rack/mousetrap_mortar
|
||||
name = "Mousetrap Mortar"
|
||||
missiles = 15
|
||||
missile_speed = 1.5
|
||||
missile_energy_cost = 100
|
||||
weapon_cooldown = 10
|
||||
|
||||
fire(target)
|
||||
if(!fire_checks(target) || missiles <=0) return
|
||||
weapon_ready = 0
|
||||
var/obj/item/weapon/mousetrap/M = new /obj/item/weapon/mousetrap(chassis.loc)
|
||||
M.armed = 1
|
||||
playsound(chassis, 'bikehorn.ogg', 60, 1)
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
missiles--
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!")
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_weapon/honker
|
||||
weapon_cooldown = 10
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker
|
||||
name = "HoNkER BlAsT 5000"
|
||||
icon_state = "mecha_honker"
|
||||
energy_drain = 200
|
||||
weapon_cooldown = 150
|
||||
equip_cooldown = 150
|
||||
construction_time = 500
|
||||
construction_cost = list("metal"=20000,"bananium"=10000)
|
||||
|
||||
fire(target)
|
||||
can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/combat/honker))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!weapon_ready)
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
weapon_ready = 0
|
||||
equip_ready = 0
|
||||
playsound(chassis, 'AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
@@ -297,20 +159,24 @@
|
||||
walk(thingy,0)
|
||||
*/
|
||||
chassis.cell.use(energy_drain)
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Honked from [src.name]. HONK!")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
|
||||
/datum/mecha_weapon/ballistic
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
|
||||
name = "General Ballisic Weapon"
|
||||
var/projectiles
|
||||
var/projectile_energy_cost
|
||||
|
||||
get_weapon_info()
|
||||
return "[src.name]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
action_checks(atom/target)
|
||||
if(..())
|
||||
if(projectiles > 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
get_equip_info()
|
||||
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
|
||||
proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
@@ -328,16 +194,17 @@
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_weapon/ballistic/scattershot
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
name = "LBX AC 10 \"Scattershot\""
|
||||
weapon_cooldown = 20
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 20
|
||||
projectiles = 100
|
||||
projectile_energy_cost = 25
|
||||
var/projectiles_per_shot = 4
|
||||
var/deviation = 0.7
|
||||
|
||||
fire(atom/target)
|
||||
if(!fire_checks(target) || projectiles <=0) return
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if(!curloc || !targloc) return
|
||||
@@ -355,25 +222,26 @@
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
weapon_ready = 0
|
||||
equip_ready = 0
|
||||
A.process()
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
|
||||
/datum/mecha_weapon/ballistic/lmg
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
name = "Ultra AC 2"
|
||||
weapon_cooldown = 10
|
||||
icon_state = "mecha_uac2"
|
||||
equip_cooldown = 10
|
||||
projectiles = 300
|
||||
projectile_energy_cost = 20
|
||||
var/projectiles_per_shot = 3
|
||||
var/deviation = 0.3
|
||||
|
||||
fire(atom/target)
|
||||
if(!fire_checks(target) || projectiles <=0) return
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/targloc = get_turf(target)
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
@@ -395,10 +263,127 @@
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
sleep(2)
|
||||
weapon_ready = 0
|
||||
spawn(weapon_cooldown)
|
||||
weapon_ready = 1
|
||||
equip_ready = 0
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
name = "SRM-8 Missile Rack"
|
||||
icon_state = "mecha_missilerack"
|
||||
projectiles = 8
|
||||
projectile_energy_cost = 1000
|
||||
equip_cooldown = 60
|
||||
var/missile_speed = 2
|
||||
var/missile_range = 30
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
equip_ready = 0
|
||||
var/obj/item/missile/M = new /obj/item/missile(chassis.loc)
|
||||
M.primed = 1
|
||||
playsound(chassis, 'bang.ogg', 50, 1)
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
/obj/item/missile
|
||||
icon = 'grenade.dmi'
|
||||
icon_state = "flashbang"
|
||||
var/primed = null
|
||||
throwforce = 15
|
||||
|
||||
throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4)
|
||||
del(src)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
|
||||
name = "SGL-6 Grenade Launcher"
|
||||
icon_state = "mecha_grenadelnchr"
|
||||
projectiles = 6
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 800
|
||||
equip_cooldown = 60
|
||||
var/det_time = 20
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
equip_ready = 0
|
||||
var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(chassis.loc)
|
||||
playsound(chassis, 'bang.ogg', 50, 1)
|
||||
F.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
spawn(det_time)
|
||||
F.prime()
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
|
||||
name = "Banana Mortar"
|
||||
icon_state = "mecha_bananamrtr"
|
||||
projectiles = 15
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 20
|
||||
construction_time = 300
|
||||
construction_cost = list("metal"=20000,"bananium"=5000)
|
||||
|
||||
can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/combat/honker))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
equip_ready = 0
|
||||
var/obj/item/weapon/bananapeel/B = new /obj/item/weapon/bananapeel(chassis.loc)
|
||||
playsound(chassis, 'bikehorn.ogg', 60, 1)
|
||||
B.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
chassis.log_message("Bananed from [src.name], targeting [target]. HONK!")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
|
||||
name = "Mousetrap Mortar"
|
||||
icon_state = "mecha_mousetrapmrtr"
|
||||
projectiles = 15
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 10
|
||||
construction_time = 300
|
||||
construction_cost = list("metal"=20000,"bananium"=5000)
|
||||
|
||||
can_attach(obj/mecha/M as obj)
|
||||
if(..())
|
||||
if(istype(M, /obj/mecha/combat/honker))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
equip_ready = 0
|
||||
var/obj/item/weapon/mousetrap/M = new /obj/item/weapon/mousetrap(chassis.loc)
|
||||
M.armed = 1
|
||||
playsound(chassis, 'bikehorn.ogg', 60, 1)
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
chassis.log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!")
|
||||
if(do_after_cooldown())
|
||||
equip_ready = 1
|
||||
return
|
||||
@@ -398,6 +398,7 @@
|
||||
"silver"=0,
|
||||
"diamond"=0,
|
||||
"plasma"=0,
|
||||
"uranium"=0,
|
||||
"bananium"=0
|
||||
)
|
||||
var/res_max_amount = 200000
|
||||
@@ -436,6 +437,20 @@
|
||||
/obj/item/mecha_parts/part/honker_left_leg,
|
||||
/obj/item/mecha_parts/part/honker_right_leg
|
||||
),
|
||||
"Exosuit Equipment"=list(
|
||||
/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/tool/rcd,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/laser,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/taser,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker),
|
||||
|
||||
"Misc"=list(/obj/item/mecha_tracking)
|
||||
|
||||
)
|
||||
@@ -535,7 +550,7 @@
|
||||
proc/output_available_resources()
|
||||
var/output
|
||||
for(var/resource in resources)
|
||||
output += "<span class=\"res_name\">[resource]: </span>[min(res_max_amount, resources[resource])] cm<sup style='font-size: 8px;'>3</sup><br>"
|
||||
output += "<span class=\"res_name\">[resource]: </span>[min(res_max_amount, resources[resource])] cm³<br>"
|
||||
return output
|
||||
|
||||
proc/remove_resources(var/obj/item/mecha_parts/part as obj)
|
||||
@@ -733,6 +748,8 @@
|
||||
material = "glass"
|
||||
else if(istype(W, /obj/item/stack/sheet/clown))
|
||||
material = "bananium"
|
||||
else if(istype(W, /obj/item/stack/sheet/uranium))
|
||||
material = "uranium"
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
+84
-45
@@ -24,6 +24,7 @@
|
||||
var/obj/item/weapon/cell/cell = new
|
||||
var/state = 0
|
||||
var/list/log = new
|
||||
var/last_message = 0
|
||||
|
||||
var/datum/effects/system/spark_spread/spark_system = new
|
||||
var/lights = 0
|
||||
@@ -52,6 +53,10 @@
|
||||
|
||||
var/wreckage
|
||||
|
||||
var/list/equipment = new
|
||||
var/obj/item/mecha_parts/mecha_equipment/selected
|
||||
var/max_equip = 2
|
||||
|
||||
|
||||
/obj/mecha/New()
|
||||
..()
|
||||
@@ -111,50 +116,21 @@
|
||||
var/dir_to_target = get_dir(src,target)
|
||||
if(dir_to_target && !(dir_to_target & src.dir))//wrong direction
|
||||
return
|
||||
if(get_dist(src,target)>1)
|
||||
src.range_action(target)
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
target = pick(view(3,target))
|
||||
var/dist = get_dist(src, target)
|
||||
if(dist>1)
|
||||
if(selected && selected.is_ranged())
|
||||
selected.action(target)
|
||||
else if(selected && !selected.is_ranged())
|
||||
selected.action(target)
|
||||
else
|
||||
src.melee_action(target)
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/proc/melee_action(atom/target)
|
||||
/*
|
||||
if(istype(target, /obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/A = target
|
||||
if(A.locked)
|
||||
src.occupant_message("Unable to open airlock - bolted")
|
||||
return 0
|
||||
else if(src.density && !src.welded && !src.operating) && ((!src.arePowerSystemsOn()) || (stat & NOPOWER)))
|
||||
if(src.arePowerSystemsOn() && !(stat&NOPOWER))
|
||||
A.open()
|
||||
else
|
||||
spawn(0)
|
||||
src.operating = 1
|
||||
animate("opening")
|
||||
sleep(15)
|
||||
src.density = 0
|
||||
update_icon()
|
||||
if (!istype(src, /obj/machinery/door/airlock/glass))
|
||||
src.sd_SetOpacity(0)
|
||||
src.operating = 0
|
||||
return 0
|
||||
else if(!src.density && !src.welded && !src.operating)
|
||||
if(src.arePowerSystemsOn() && !(stat&NOPOWER))
|
||||
A.close()
|
||||
else
|
||||
spawn( 0 )
|
||||
src.operating = 1
|
||||
animate("closing")
|
||||
src.density = 1
|
||||
sleep(15)
|
||||
update_icon()
|
||||
if ((src.visible) && (!istype(src, /obj/machinery/door/airlock/glass)))
|
||||
src.sd_SetOpacity(1)
|
||||
src.operating = 0
|
||||
return 0
|
||||
*/
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/mecha/proc/range_action(atom/target)
|
||||
return
|
||||
@@ -234,15 +210,23 @@
|
||||
// src.inertia_dir = null
|
||||
if(istype(obstacle, /obj))
|
||||
var/obj/O = obstacle
|
||||
if(istype(obstacle , /obj/machinery/door))
|
||||
if(istype(O , /obj/machinery/door))
|
||||
if(src.occupant)
|
||||
O.Bumped(src.occupant)
|
||||
/* //not working, will fix later
|
||||
else if(istype(O, /obj/portal)) //derpfix
|
||||
src.anchored = 0
|
||||
O.Bumped(src)
|
||||
src.anchored = 1
|
||||
*/
|
||||
else if(!O.anchored)
|
||||
step(obstacle,src.dir)
|
||||
// else
|
||||
// obstacle.Bumped(src)
|
||||
else //I have no idea why I disabled this
|
||||
obstacle.Bumped(src)
|
||||
else if(istype(obstacle, /mob))
|
||||
step(obstacle,src.dir)
|
||||
else
|
||||
obstacle.Bumped(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -255,12 +239,13 @@
|
||||
if("brute")
|
||||
src.health -= amount
|
||||
if("fire")
|
||||
src.health -= amount*1.2
|
||||
amount *= 1.2
|
||||
src.health -= amount
|
||||
src.update_health()
|
||||
src.log_append_to_last("Took [amount] points of damage. Damage type: \"[type]\".",1)
|
||||
return
|
||||
|
||||
/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)//TODO
|
||||
/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)
|
||||
if(!src) return
|
||||
if(prob(25))
|
||||
if(ignore_threshold || src.health*100/initial(src.health)<src.internal_damage_threshold)
|
||||
@@ -274,6 +259,21 @@
|
||||
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)<src.internal_damage_threshold)
|
||||
if(equipment.len)
|
||||
var/obj/item/mecha_parts/mecha_equipment/destr = pick(equipment)
|
||||
if(destr)
|
||||
equipment -= destr
|
||||
while(null in equipment)
|
||||
equipment -= null
|
||||
destr.destroy()
|
||||
src.occupant_message("<font color='red'>The [destr] is destroyed!</font>")
|
||||
src.log_append_to_last("[destr] is destroyed.",1)
|
||||
if(istype(destr, /obj/item/mecha_parts/mecha_equipment/weapon))
|
||||
src.occupant << sound('weapdestr.ogg',volume=50)
|
||||
else
|
||||
src.occupant << sound('critdestr.ogg',volume=50)
|
||||
return
|
||||
|
||||
|
||||
@@ -390,12 +390,20 @@
|
||||
// var/mob/M = src.occupant
|
||||
var/turf/T = src.loc
|
||||
var/wreckage = src.wreckage
|
||||
var/list/r_equipment = src.equipment
|
||||
src = null
|
||||
del(mecha)
|
||||
explosion(T, 0, 0, 1, 3)
|
||||
spawn(0)
|
||||
if(wreckage)
|
||||
new wreckage(T)
|
||||
var/obj/decal/mecha_wreckage/WR = new wreckage(T)
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/E in r_equipment)
|
||||
if(prob(30))
|
||||
WR.equipment += E
|
||||
E.reliability = rand(30,100)
|
||||
else
|
||||
E.loc = T
|
||||
E.destroy()
|
||||
return
|
||||
|
||||
/obj/mecha/ex_act(severity)
|
||||
@@ -596,7 +604,10 @@
|
||||
return
|
||||
usr << "You start climbing into [src.name]"
|
||||
spawn(20)
|
||||
moved_inside(usr)
|
||||
if(!src.occupant)
|
||||
moved_inside(usr)
|
||||
else if(src.occupant!=usr)
|
||||
usr << "[src.occupant] was faster. Try better next time, loser."
|
||||
return
|
||||
|
||||
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
@@ -730,6 +741,16 @@
|
||||
|
||||
|
||||
/obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/mecha_parts/mecha_equipment))
|
||||
var/obj/item/mecha_parts/mecha_equipment/E = W
|
||||
spawn()
|
||||
if(E.can_attach(src))
|
||||
user.drop_item()
|
||||
E.attach(src)
|
||||
user.visible_message("[user] attaches [W] to [src]", "You attach [W] to [src]")
|
||||
else
|
||||
user << "You were unable to attach [W] to [src]"
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
|
||||
if(src.occupant)
|
||||
user << "Unable to initiate maintenance protocol."
|
||||
@@ -900,6 +921,10 @@
|
||||
else
|
||||
src.occupant_message("<font color='red'>Recalibration failed.</font>")
|
||||
src.log_message("Recalibration of coordination system failed with 1 error.",1)
|
||||
if(href_list["select_equip"])
|
||||
var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"])
|
||||
if(equip)
|
||||
src.selected = equip
|
||||
/*
|
||||
|
||||
if (href_list["ai_take_control"])
|
||||
@@ -965,10 +990,24 @@
|
||||
|
||||
/obj/mecha/hear_talk(mob/M as mob, text)
|
||||
if(occupant && M)
|
||||
if(!occupant.say_understands(M))
|
||||
text = stars(text)
|
||||
var/rendered = "<span class='game say'><span class='name'>[M.name]</span> <span class='message'>[M.say_quote(text)]</span></span>"
|
||||
occupant.show_message(rendered, 2)
|
||||
return
|
||||
/*
|
||||
if ("binary")
|
||||
if(src.robot_talk_understand || src.binarycheck())
|
||||
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
|
||||
src.robot_talk(message)
|
||||
return
|
||||
|
||||
if ("alientalk")
|
||||
if(src.alien_talk_understand || src.hivecheck())
|
||||
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
|
||||
src.alien_talk(message)
|
||||
return
|
||||
*/
|
||||
/obj/mecha/proc/get_charge()//returns null if no powercell, else returns cell.charge
|
||||
if(!src.cell) return
|
||||
return max(0, src.cell.charge)
|
||||
|
||||
@@ -102,13 +102,7 @@
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa<br>
|
||||
<b>Pilot:</b> [M.occupant||"None"]<br>
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]<br>
|
||||
<b>Active equipment:</b>"}
|
||||
if(istype(M, /obj/mecha/combat))
|
||||
var/obj/mecha/combat/CM = M
|
||||
answer += " [CM.selected_weapon.name]<br>"
|
||||
else if(istype(M, /obj/mecha/working))
|
||||
var/obj/mecha/working/WM = M
|
||||
answer += " [WM.selected_tool.name]<br>"
|
||||
<b>Active equipment:</b> [M.selected||"None"]"}
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/list/welder_salvage = list("/obj/item/stack/sheet/r_metal","/obj/item/stack/sheet/metal","/obj/item/stack/rods")
|
||||
var/list/wirecutters_salvage = list("/obj/item/weapon/cable_coil")
|
||||
var/list/crowbar_salvage = list("/obj/item/weapon/cell")
|
||||
var/list/equipment = new
|
||||
var/salvage_num = 5
|
||||
|
||||
/obj/decal/mecha_wreckage/ex_act(severity)
|
||||
@@ -50,6 +51,12 @@
|
||||
user << "You failed to salvage anything valuable from [src]."
|
||||
salvage_num--
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
if(equipment.len)
|
||||
var/obj/item/mecha_parts/mecha_equipment/E = pick(equipment)
|
||||
if(E)
|
||||
E.loc = get_turf(user)
|
||||
user.visible_message("[user] pries [E] from [src].", "You pry [E] from [src].")
|
||||
return
|
||||
if(salvage_num<=0)
|
||||
user << "You can't see anything of value left on this wreck."
|
||||
return
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
/obj/mecha/working/firefighter
|
||||
desc = "Standart APLU chassis was refitted with additional thermal protection, cistern and fire pump."
|
||||
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
|
||||
name = "Ripley-on-Fire"
|
||||
icon_state = "ripley"
|
||||
step_in = 8
|
||||
max_temperature = 6000
|
||||
health = 200
|
||||
health = 250
|
||||
internal_damage_threshold = 40
|
||||
wreckage = "/obj/decal/mecha_wreckage/ripley"
|
||||
infra_luminosity = 5
|
||||
|
||||
|
||||
/*
|
||||
/obj/mecha/working/firefighter/New()
|
||||
..()
|
||||
// tools += new /datum/mecha_tool/uni_interface(src)
|
||||
@@ -21,4 +21,5 @@
|
||||
tools += new g_type(src)
|
||||
*/
|
||||
selected_tool = tools[1]
|
||||
return
|
||||
return
|
||||
*/
|
||||
@@ -6,23 +6,19 @@
|
||||
max_temperature = 1000
|
||||
health = 200
|
||||
wreckage = "/obj/decal/mecha_wreckage/ripley"
|
||||
|
||||
var/list/cargo = new
|
||||
var/cargo_capacity = 15
|
||||
|
||||
|
||||
/*
|
||||
/obj/mecha/working/ripley/New()
|
||||
..()
|
||||
// tools += new /datum/mecha_tool/uni_interface(src)
|
||||
tools += new /datum/mecha_tool/hydraulic_clamp(src)
|
||||
tools += new /datum/mecha_tool/drill(src)
|
||||
/*
|
||||
for(var/g_type in typesof(/datum/mecha_tool/gimmick))
|
||||
if(g_type!=/datum/mecha_tool/gimmick)
|
||||
tools += new g_type(src)
|
||||
*/
|
||||
selected_tool = tools[1]
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/mecha/working/ripley/Exit(atom/movable/O)
|
||||
if(O in cargo)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/mecha/working/ripley/Topic(href, href_list)
|
||||
@@ -57,9 +53,7 @@
|
||||
if(M==src.occupant)
|
||||
continue
|
||||
M.loc = get_turf(src)
|
||||
var/turf/T = get_turf(M)
|
||||
if(T)
|
||||
T.Entered(M)
|
||||
M.loc.Entered(M)
|
||||
step_rand(M)
|
||||
for(var/atom/movable/A in src.cargo)
|
||||
A.loc = get_turf(src)
|
||||
|
||||
@@ -1,297 +0,0 @@
|
||||
/datum/mecha_tool
|
||||
var/name = "mecha tool"
|
||||
var/tool_cooldown = 0
|
||||
var/tool_ready = 1
|
||||
var/energy_drain = 0
|
||||
var/obj/mecha/working/chassis = null
|
||||
|
||||
|
||||
/datum/mecha_tool/New(mecha)
|
||||
if(!istype(mecha, /obj/mecha/working))
|
||||
return
|
||||
src.chassis = mecha
|
||||
chassis.log_append_to_last("[src.name] initialized.")
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_tool/proc/destroy()
|
||||
spawn
|
||||
del src
|
||||
return
|
||||
|
||||
/datum/mecha_tool/proc/get_tool_info()
|
||||
return src.name
|
||||
|
||||
|
||||
/datum/mecha_tool/proc/action(atom/target)
|
||||
if(!target)
|
||||
return 0
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!tool_ready)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/mecha_tool/proc/range_action(atom/target)
|
||||
return
|
||||
|
||||
|
||||
/*
|
||||
//Merde, cette proc est tres bugged
|
||||
/datum/mecha_tool/uni_interface
|
||||
name = "Universal Interface"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 5
|
||||
|
||||
action(atom/target)
|
||||
if(!..()) return
|
||||
if(istype(target, /obj))
|
||||
var/obj/O = target
|
||||
if(O.allowed(chassis.occupant))
|
||||
target.attack_hand(chassis.occupant)
|
||||
return
|
||||
|
||||
*/
|
||||
|
||||
/datum/mecha_tool/hydraulic_clamp
|
||||
name = "Hydraulic Clamp"
|
||||
tool_cooldown = 15
|
||||
energy_drain = 10
|
||||
var/force = 20
|
||||
var/obj/mecha/working/ripley/cargo_holder
|
||||
|
||||
New()
|
||||
..()
|
||||
if(istype(chassis, /obj/mecha/working/ripley))
|
||||
cargo_holder = chassis
|
||||
return
|
||||
|
||||
action(atom/target)
|
||||
if(!..()) return
|
||||
if(!cargo_holder) return
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(!O.anchored)
|
||||
if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
|
||||
chassis.occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
tool_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
spawn(tool_cooldown)
|
||||
if(chassis)
|
||||
if(T == chassis.loc && src == chassis.selected_tool)
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.anchored = 0
|
||||
if(istype(O, /obj/machinery/bot))// That's shit-code right here, folks.
|
||||
O:on = 0
|
||||
chassis.occupant_message("<font color='blue'>[target] succesfully loaded.</font>")
|
||||
chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
else
|
||||
chassis.occupant_message("<font color='red'>You must hold still while handling objects.</font>")
|
||||
O.anchored = initial(O.anchored)
|
||||
tool_ready = 1
|
||||
|
||||
else
|
||||
chassis.occupant << "<font color='red'>Not enough room in cargo compartment.</font>"
|
||||
else
|
||||
chassis.occupant << "<font color='red'>[target] is firmly secured.</font>"
|
||||
|
||||
else if(istype(target,/mob))
|
||||
var/mob/M = target
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == "hurt")
|
||||
M.bruteloss += force
|
||||
M.oxyloss += round(force/2)
|
||||
M.updatehealth()
|
||||
chassis.occupant_message("\red You squeese [target] with [src.name]. Something cracks.")
|
||||
chassis.visible_message("\red [chassis] squeeses [target].")
|
||||
else
|
||||
step_away(M,chassis)
|
||||
chassis.occupant_message("You push [target] out of the way.")
|
||||
chassis.visible_message("[chassis] pushes [target] out of the way.")
|
||||
tool_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
spawn(tool_cooldown)
|
||||
tool_ready = 1
|
||||
return
|
||||
|
||||
/datum/mecha_tool/drill
|
||||
name = "Drill"
|
||||
tool_cooldown = 40
|
||||
energy_drain = 20
|
||||
var/force = 15
|
||||
|
||||
action(atom/target)
|
||||
if(!..()) return
|
||||
tool_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
chassis.visible_message("<font color='red'><b>[chassis] starts to drill [target]</b></font>", "You hear the drill.")
|
||||
chassis.occupant_message("<font color='red'><b>You start to drill [target]</b></font>")
|
||||
var/T = chassis.loc
|
||||
spawn(tool_cooldown)
|
||||
if(chassis)
|
||||
if(T == chassis.loc && src == chassis.selected_tool)
|
||||
if(istype(target, /turf/simulated/wall/r_wall))
|
||||
chassis.occupant_message("<font color='red'>[target] is too durable to drill through.</font>")
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
var/turf/simulated/mineral/M = target
|
||||
chassis.log_message("Drilled through [target]")
|
||||
M.gets_drilled()
|
||||
for(var/turf/simulated/mineral/N in range(chassis,1))
|
||||
if(get_dir(chassis,N)&chassis.dir)
|
||||
N.gets_drilled()
|
||||
else
|
||||
chassis.log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
tool_ready = 1
|
||||
return
|
||||
|
||||
|
||||
/datum/mecha_tool/extinguisher
|
||||
name = "Extinguisher"
|
||||
tool_cooldown = 7
|
||||
energy_drain = 0
|
||||
var/datum/reagents/reagents
|
||||
|
||||
|
||||
New()
|
||||
reagents = new/datum/reagents(200)
|
||||
reagents.my_atom = src
|
||||
reagents.add_reagent("water", 200)
|
||||
..()
|
||||
return
|
||||
|
||||
action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch.
|
||||
if(!..()) return
|
||||
if(get_dist(chassis, target)>2) return
|
||||
tool_ready = 0
|
||||
spawn(tool_cooldown)
|
||||
tool_ready = 1
|
||||
if(istype(target, /obj/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
|
||||
var/obj/o = target
|
||||
o.reagents.trans_to(src, 200)
|
||||
chassis.occupant_message("\blue Extinguisher refilled")
|
||||
playsound(chassis, 'refill.ogg', 50, 1, -6)
|
||||
else
|
||||
if(src.reagents.total_volume > 0)
|
||||
playsound(chassis, 'extinguish.ogg', 75, 1, -3)
|
||||
var/direction = get_dir(chassis,target)
|
||||
var/turf/T = get_turf(target)
|
||||
var/turf/T1 = get_step(T,turn(direction, 90))
|
||||
var/turf/T2 = get_step(T,turn(direction, -90))
|
||||
|
||||
var/list/the_targets = list(T,T1,T2)
|
||||
for(var/a=0, a<5, a++)
|
||||
spawn(0)
|
||||
var/obj/effects/water/W = new /obj/effects/water(get_turf(chassis))
|
||||
if(!W)
|
||||
return
|
||||
var/turf/my_target = pick(the_targets)
|
||||
var/datum/reagents/R = new/datum/reagents(5)
|
||||
W.reagents = R
|
||||
R.my_atom = W
|
||||
src.reagents.trans_to(W,1)
|
||||
for(var/b=0, b<5, b++)
|
||||
if(!W)
|
||||
return
|
||||
step_towards(W,my_target)
|
||||
if(!W)
|
||||
return
|
||||
var/turf/W_turf = get_turf(W)
|
||||
W.reagents.reaction(W_turf)
|
||||
for(var/atom/atm in W_turf)
|
||||
W.reagents.reaction(atm)
|
||||
if(W.loc == my_target)
|
||||
break
|
||||
sleep(2)
|
||||
return
|
||||
|
||||
get_tool_info()
|
||||
return "[src.name] \[[src.reagents.total_volume]\]"
|
||||
|
||||
proc/on_reagent_change()
|
||||
return
|
||||
|
||||
|
||||
/*
|
||||
/datum/mecha_tool/gimmick
|
||||
name = "Gimmick"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 10
|
||||
var/real_tool_type
|
||||
var/real_tool_obj
|
||||
|
||||
action(atom/target)
|
||||
if(!..()) return
|
||||
target.attackby(real_tool_obj,chassis.occupant)
|
||||
tool_ready = 0
|
||||
chassis.cell.use(energy_drain)
|
||||
spawn(tool_cooldown)
|
||||
tool_ready = 1
|
||||
return
|
||||
|
||||
New()
|
||||
..()
|
||||
real_tool_obj = new real_tool_type(chassis)
|
||||
return
|
||||
|
||||
/datum/mecha_tool/gimmick/screwdriver
|
||||
name = "Screwdriver"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 10
|
||||
real_tool_type = /obj/item/weapon/screwdriver
|
||||
|
||||
|
||||
/datum/mecha_tool/gimmick/wrench
|
||||
name = "Wrench"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 10
|
||||
real_tool_type = /obj/item/weapon/wrench
|
||||
|
||||
/datum/mecha_tool/gimmick/wirecutters
|
||||
name = "Wirecutters"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 10
|
||||
real_tool_type = /obj/item/weapon/wirecutters
|
||||
|
||||
/datum/mecha_tool/gimmick/multitool
|
||||
name = "Multitool"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 10
|
||||
real_tool_type = /obj/item/device/multitool
|
||||
|
||||
/datum/mecha_tool/gimmick/crowbar
|
||||
name = "Crowbar"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 10
|
||||
real_tool_type = /obj/item/weapon/crowbar
|
||||
|
||||
/datum/mecha_tool/gimmick/weldingtool
|
||||
name = "Weldingtool"
|
||||
tool_cooldown = 10
|
||||
tool_ready = 1
|
||||
energy_drain = 15
|
||||
real_tool_type = /obj/item/weapon/weldingtool
|
||||
|
||||
action(atom/target)
|
||||
var/obj/item/weapon/weldingtool/W = real_tool_obj
|
||||
W.welding = 1
|
||||
W.reagents.add_reagent("fuel", W.reagents.maximum_volume - W.get_fuel())
|
||||
..()
|
||||
return
|
||||
*/
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
deflect_chance = 10
|
||||
health = 500
|
||||
req_access = access_heads
|
||||
var/datum/mecha_tool/selected_tool
|
||||
var/list/tools = new
|
||||
operation_req_access = list(access_engine,access_robotics)
|
||||
internals_req_access = list(access_engine,access_robotics)
|
||||
var/add_req_access = 1
|
||||
@@ -14,23 +12,20 @@
|
||||
new /obj/item/mecha_tracking(src)
|
||||
return
|
||||
|
||||
|
||||
/*
|
||||
/obj/mecha/working/melee_action(atom/target as obj|mob|turf)
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
target = pick(oview(1,src))
|
||||
if(selected_tool)
|
||||
selected_tool.action(target)
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/mecha/working/range_action(atom/target as obj|mob|turf)
|
||||
return
|
||||
|
||||
/obj/mecha/working/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["select_tool"])
|
||||
var/tool = locate(href_list["select_tool"])
|
||||
if(tool)
|
||||
src.selected_tool = tool
|
||||
if (href_list["unlock_id_upload"])
|
||||
add_req_access = 1
|
||||
if (href_list["add_req_access"])
|
||||
@@ -50,29 +45,15 @@
|
||||
/obj/mecha/working/get_stats_part()
|
||||
var/output = ..()
|
||||
output += "<b>[src.name] Tools:</b><div style=\"margin-left: 15px;\">"
|
||||
if(tools.len)
|
||||
for(var/datum/mecha_tool/MT in tools)
|
||||
output += "[selected_tool==MT?"<b>":"<a href='?src=\ref[src];select_tool=\ref[MT]'>"][MT.get_tool_info()][selected_tool==MT?"</b>":"</a>"]<br>"
|
||||
if(equipment.len)
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment)
|
||||
output += "[selected==MT?"<b>":"<a href='?src=\ref[src];select_equip=\ref[MT]'>"][MT.get_equip_info()][selected==MT?"</b>":"</a>"]<br>"
|
||||
else
|
||||
output += "None"
|
||||
output += "</div>"
|
||||
return output
|
||||
|
||||
|
||||
/obj/mecha/working/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)
|
||||
..()
|
||||
if(prob(5) && (ignore_threshold || (src.health*100/initial(src.health))<src.internal_damage_threshold))
|
||||
if(tools.len)
|
||||
var/datum/mecha_tool/destr_tool = pick(tools)
|
||||
if(destr_tool)
|
||||
tools -= destr_tool
|
||||
destr_tool.destroy()
|
||||
src.occupant_message("<font color='red'>The [destr_tool] is destroyed!</font>")
|
||||
src.log_append_to_last("[destr_tool] is destroyed.")
|
||||
src.occupant << sound('critdestr.ogg',volume=50)
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/working/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(add_req_access && (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)))
|
||||
var/obj/item/weapon/card/id/id_card
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 21 KiB |
@@ -913,7 +913,7 @@
|
||||
"arC" = (/obj/machinery/door/airlock/external{name = "West Auxillary Solar Maintenance"; req_access = null; req_access_txt = "13"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
|
||||
"arD" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/storage/tech)
|
||||
"arE" = (/obj/rack{dir = 8},/obj/item/weapon/circuitboard/aiupload,/turf/simulated/floor,/area/storage/tech)
|
||||
"arF" = (/obj/rack{dir = 8},/obj/item/weapon/circuitboard/robotics,/turf/simulated/floor,/area/storage/tech)
|
||||
"arF" = (/obj/rack{dir = 8},/obj/item/weapon/circuitboard/mecha_control{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/robotics{pixel_x = 1; pixel_y = -1},/turf/simulated/floor,/area/storage/tech)
|
||||
"arG" = (/obj/machinery/atmospherics/pipe/simple{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
|
||||
"arH" = (/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
|
||||
"arI" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
|
||||
|
||||
+7
-4
@@ -53,9 +53,10 @@
|
||||
#define FILE_DIR "code/game/magic/cultist"
|
||||
#define FILE_DIR "code/game/mecha"
|
||||
#define FILE_DIR "code/game/mecha/combat"
|
||||
#define FILE_DIR "code/game/mecha/combat/weapons"
|
||||
#define FILE_DIR "code/game/mecha/equipment"
|
||||
#define FILE_DIR "code/game/mecha/equipment/tools"
|
||||
#define FILE_DIR "code/game/mecha/equipment/weapons"
|
||||
#define FILE_DIR "code/game/mecha/working"
|
||||
#define FILE_DIR "code/game/mecha/working/tools"
|
||||
#define FILE_DIR "code/game/objects"
|
||||
#define FILE_DIR "code/game/objects/alien"
|
||||
#define FILE_DIR "code/game/objects/closets"
|
||||
@@ -429,14 +430,16 @@
|
||||
#include "code\game\mecha\mecha_control_console.dm"
|
||||
#include "code\game\mecha\mecha_wreckage.dm"
|
||||
#include "code\game\mecha\combat\combat.dm"
|
||||
#include "code\game\mecha\combat\durand.dm"
|
||||
#include "code\game\mecha\combat\gygax.dm"
|
||||
#include "code\game\mecha\combat\honker.dm"
|
||||
#include "code\game\mecha\combat\marauder.dm"
|
||||
#include "code\game\mecha\combat\weapons\weapons.dm"
|
||||
#include "code\game\mecha\equipment\mecha_equipment.dm"
|
||||
#include "code\game\mecha\equipment\tools\tools.dm"
|
||||
#include "code\game\mecha\equipment\weapons\weapons.dm"
|
||||
#include "code\game\mecha\working\firefighter.dm"
|
||||
#include "code\game\mecha\working\ripley.dm"
|
||||
#include "code\game\mecha\working\working.dm"
|
||||
#include "code\game\mecha\working\tools\tools.dm"
|
||||
#include "code\game\objects\assemblies.dm"
|
||||
#include "code\game\objects\blood.dm"
|
||||
#include "code\game\objects\bomb.dm"
|
||||
|
||||
Reference in New Issue
Block a user