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:
panurgomatic
2011-03-15 15:20:02 +00:00
parent 2334e24491
commit 8c938b79cb
23 changed files with 823 additions and 659 deletions
+2
View File
@@ -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)))
+26
View File
@@ -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
+23 -11
View File
@@ -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."
+7 -30
View File
@@ -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>"
+6 -3
View File
@@ -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
+2
View File
@@ -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"
+7 -7
View File
@@ -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>"
+10 -5
View File
@@ -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
+337
View File
@@ -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
@@ -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
+18 -1
View File
@@ -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&sup3;<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
View File
@@ -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)
+1 -7
View File
@@ -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>"
+7
View File
@@ -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
+5 -4
View File
@@ -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
*/
+8 -14
View File
@@ -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)
-297
View File
@@ -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
*/
+5 -24
View File
@@ -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

+1 -1
View File
@@ -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
View File
@@ -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"