Merge pull request #918 from Screemonster/micromecha

Adds micro-only light mech/vehicle framework, plus equipment.
This commit is contained in:
Arokha Sieyes
2017-02-08 10:33:34 -05:00
committed by GitHub
7 changed files with 454 additions and 0 deletions

View File

@@ -0,0 +1,147 @@
/obj/mecha/micro
icon = 'icons/mecha/micro.dmi'
force = 10 //still a robot
anchored = 0 //light enough to push and pull, but you still can't just walk past them. Like people on non-help.
opacity = 0 //small enough to see around, like people.
step_energy_drain = 2 // They're light and small. A compact is gonna get better MPG than a truck.
var/melee_cooldown = 10
var/melee_can_hit = 1
var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall)
internal_damage_threshold = 50
maint_access = 0
//add_req_access = 0
//operation_req_access = list(access_hos)
damage_absorption = list("brute"=1,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
var/am = "d3c2fbcadca903a41161ccc9df9cf948"
/obj/mecha/micro/melee_action(target as obj|mob|turf)
if(internal_damage&MECHA_INT_CONTROL_LOST)
target = safepick(oview(1,src))
if(!melee_can_hit || !istype(target, /atom)) return
if(istype(target, /mob/living))
var/mob/living/M = target
if(src.occupant.a_intent == I_HURT)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if(damtype == "brute")
step_away(M,src,15)
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
// if (M.health <= 0) return
var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD))
if(temp)
var/update = 0
switch(damtype)
if("brute")
H.Paralyse(1)
update |= temp.take_damage(rand(force/2, force), 0)
if("fire")
update |= temp.take_damage(0, rand(force/2, force))
if("tox")
if(H.reagents)
if(H.reagents.get_reagent_amount("carpotoxin") + force < force*2)
H.reagents.add_reagent("carpotoxin", force)
if(H.reagents.get_reagent_amount("cryptobiolin") + force < force*2)
H.reagents.add_reagent("cryptobiolin", force)
else
return
if(update) H.UpdateDamageIcon()
H.updatehealth()
else
switch(damtype)
if("brute")
M.Paralyse(1)
M.take_overall_damage(rand(force/2, force))
if("fire")
M.take_overall_damage(0, rand(force/2, force))
if("tox")
if(M.reagents)
if(M.reagents.get_reagent_amount("carpotoxin") + force < force*2)
M.reagents.add_reagent("carpotoxin", force)
if(M.reagents.get_reagent_amount("cryptobiolin") + force < force*2)
M.reagents.add_reagent("cryptobiolin", force)
else
return
M.updatehealth()
src.occupant_message("You hit [target].")
src.visible_message("<font color='red'><b>[src.name] hits [target].</b></font>")
else
step_away(M,src)
src.occupant_message("You push [target] out of the way.")
src.visible_message("[src] pushes [target] out of the way.")
melee_can_hit = 0
if(do_after(melee_cooldown))
melee_can_hit = 1
return
else
if(damtype == "brute")
for(var/target_type in src.destroyable_obj)
if(istype(target, target_type) && hascall(target, "attackby"))
src.occupant_message("You hit [target].")
src.visible_message("<font color='red'><b>[src.name] hits [target]</b></font>")
if(!istype(target, /turf/simulated/wall))
target:attackby(src,src.occupant)
else if(prob(5))
target:dismantle_wall(1)
src.occupant_message("<span class='notice'>You smash through the wall.</span>")
src.visible_message("<b>[src.name] smashes through the wall</b>")
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
melee_can_hit = 0
if(do_after(melee_cooldown))
melee_can_hit = 1
break
return
/obj/mecha/micro/Topic(href,href_list)
..()
var/datum/topic_input/filter = new (href,href_list)
if(filter.get("close"))
am = null
return
// override move_inside() so only micro crew can use them
/obj/mecha/micro/move_inside()
var/mob/living/carbon/C = usr
if (C.size_multiplier >= 0.5)
C << "<span class='warning'>You can't fit in this suit!</span>"
return
else
..()
/obj/mecha/micro/move_inside_passenger()
var/mob/living/carbon/C = usr
if (C.size_multiplier >= 0.5)
C << "<span class='warning'>You can't fit in this suit!</span>"
return
else
..()
// override move/turn procs so they play more appropriate sounds. Placeholder sounds for now, but mechmove04 at least sounds like tracks for the poleat.
/obj/mecha/micro/mechturn(direction)
set_dir(direction)
playsound(src,'sound/mecha/mechmove03.ogg',40,1)
return 1
/obj/mecha/micro/mechstep(direction)
var/result = step(src,direction)
if(result)
playsound(src,'sound/mecha/mechmove04.ogg',40,1)
return result
/obj/mecha/micro/mechsteprand()
var/result = step_rand(src)
if(result)
playsound(src,'sound/mecha/mechmove04.ogg',40,1)
return result
/obj/effect/decal/mecha_wreckage/micro
icon = 'icons/mecha/micro.dmi'

View File

@@ -0,0 +1,221 @@
//DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE!
/////////////////////////////
//// WEAPONS BELOW ////
/////////////////////////////
/obj/item/mecha_parts/mecha_equipment/weapon/energy/microlaser
w_class = ITEMSIZE_LARGE
desc = "A mounted laser-carbine for light exosuits."
equip_cooldown = 10 // same as the laser carbine
name = "\improper WS-19 \"Torch\" laser carbine"
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_laser"
energy_drain = 50
projectile = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg'
required_type = list(/obj/mecha/micro/sec)
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy
w_class = ITEMSIZE_LARGE
desc = "A mounted laser cannon for light exosuits."
equip_cooldown = 30 // same as portable
name = "\improper PC-20 \"Lance\" light laser cannon"
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_lasercannon"
energy_drain = 120
projectile = /obj/item/projectile/beam/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg'
required_type = list(/obj/mecha/micro/sec)
/obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser
w_class = ITEMSIZE_LARGE
desc = "A mounted taser for light exosuits."
name = "\improper TS-12 \"Suppressor\" integrated taser"
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_taser"
energy_drain = 40
equip_cooldown = 10
projectile = /obj/item/projectile/beam/stun
fire_sound = 'sound/weapons/Taser.ogg'
required_type = list(/obj/mecha/micro/sec)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun
w_class = ITEMSIZE_LARGE
desc = "A mounted combat shotgun with integrated ammo-lathe."
name = "\improper Remington C-12 \"Boomstick\""
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_shotgun"
equip_cooldown = 15
var/mode = 0 //0 - buckshot, 1 - beanbag, 2 - slug.
projectile = /obj/item/projectile/bullet/pellet/shotgun
fire_sound = 'sound/weapons/shotgun.ogg'
fire_volume = 80
projectiles = 6
projectiles_per_shot = 1
deviation = 0.7
projectile_energy_cost = 100
required_type = list(/obj/mecha/micro/sec)
Topic(href,href_list)
..()
if(href_list["mode"])
mode = text2num(href_list["mode"])
switch(mode)
if(0)
occupant_message("Now firing buckshot.")
projectile = /obj/item/projectile/bullet/pellet/shotgun
if(1)
occupant_message("Now firing beanbags.")
projectile = /obj/item/projectile/bullet/shotgun/beanbag
if(2)
occupant_message("Now firing slugs.")
projectile = /obj/item/projectile/bullet/shotgun
return
get_equip_info()
return "[..()] \[<a href='?src=\ref[src];mode=0'>BS</a>|<a href='?src=\ref[src];mode=1'>BB</a>|<a href='?src=\ref[src];mode=2'>S</a>\]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/microflashbang
w_class = ITEMSIZE_LARGE
desc = "A mounted grenade launcher for smaller mechs."
name = "\improper FP-20 mounted grenade launcher"
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "micromech_launcher"
projectiles = 1
missile_speed = 1.5
projectile_energy_cost = 800
equip_cooldown = 30
det_time = 15
required_type = list(/obj/mecha/micro/sec)
/////////////////////////////
//// UTILITY TOOLS BELOW ////
/////////////////////////////
/obj/item/mecha_parts/mecha_equipment/tool/drill/micro
w_class = ITEMSIZE_LARGE
name = "drill"
desc = "This is the drill that'll sorta poke holes in the heavens!"
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "microdrill"
equip_cooldown = 30
energy_drain = 10
force = 15
required_type = list(/obj/mecha/micro/utility)
action(atom/target)
if(!action_checks(target)) return
if(isobj(target))
var/obj/target_obj = target
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
set_ready_state(0)
chassis.use_power(energy_drain)
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
occupant_message("<span class='danger'>You start to drill [target]</span>")
var/T = chassis.loc
var/C = target.loc //why are these backwards? we may never know -Pete
if(do_after_cooldown(target))
if(T == chassis.loc && src == chassis.selected)
if(istype(target, /turf/simulated/wall))
var/turf/simulated/wall/W = target
if(W.reinf_material)
occupant_message("<span class='warning'>[target] is too durable to drill through.</span>")
else
log_message("Drilled through [target]")
target.ex_act(2)
else if(istype(target, /turf/simulated/mineral))
for(var/turf/simulated/mineral/M in range(chassis,1))
if(get_dir(chassis,M)&chassis.dir)
M.GetDrilled()
log_message("Drilled through [target]")
var/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/ore_box = (locate(/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop) in chassis.equipment)
if(ore_box)
for(var/obj/item/weapon/ore/ore in range(chassis,1))
if(get_dir(chassis,ore)&chassis.dir)
if (ore_box.contents.len >= ore_box.orecapacity)
occupant_message("<span class='warning'>The ore compartment is full.</span>")
return 1
else
ore.Move(ore_box)
else if(target.loc == C)
log_message("Drilled through [target]")
target.ex_act(2)
return 1
/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop
w_class = ITEMSIZE_LARGE
name = "Mounted ore box"
desc = "A mounted ore scoop and hopper, for gathering ores."
icon = 'icons/mecha/mecha_equipment_vr.dmi'
icon_state = "microscoop"
equip_cooldown = 5
energy_drain = 0
required_type = list(/obj/mecha/micro/utility)
var/orecapacity = 500
action(atom/target)
if(!action_checks(target)) return
set_ready_state(0)
chassis.use_power(energy_drain)
chassis.visible_message("<span class='info'>[chassis] sweeps around with its ore scoop.</span>")
occupant_message("<span class='info'>You sweep around the area with the scoop.</span>")
var/T = chassis.loc
//var/C = target.loc //why are these backwards? we may never know -Pete
if(do_after_cooldown(target))
if(T == chassis.loc && src == chassis.selected)
for(var/obj/item/weapon/ore/ore in range(chassis,1))
if(get_dir(chassis,ore)&chassis.dir)
if (contents.len >= orecapacity)
occupant_message("<span class='warning'>The ore compartment is full.</span>")
return 1
else
ore.Move(src)
return 1
Topic(href,href_list)
..()
if (href_list["empty_box"])
if(contents.len < 1)
occupant_message("The ore compartment is empty.")
return
for (var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = chassis.loc
occupant_message("Ore compartment emptied.")
get_equip_info()
return "[..()] <br /><a href='?src=\ref[src];empty_box=1'>Empty ore compartment</a>"
/obj/item/mecha_parts/mecha_equipment/tool/orescoop/verb/empty_box() //so you can still get the ore out if someone detaches it from the mech
set name = "Empty Ore compartment"
set category = "Object"
set src in view(1)
if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes.
usr << "\red You are physically incapable of emptying the ore box."
return
if( usr.stat || usr.restrained() )
return
if(!Adjacent(usr)) //You can only empty the box if you can physically reach it
usr << "You cannot reach the ore box."
return
add_fingerprint(usr)
if(contents.len < 1)
usr << "\red The ore box is empty"
return
for (var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = src.loc
usr << "\blue You empty the ore box"
return

View File

@@ -0,0 +1,58 @@
/obj/mecha/micro/sec/moved_inside(var/mob/living/carbon/human/H as mob)
if(..())
if(H.client)
H.client.mouse_pointer_icon = file("icons/mecha/mecha_mouse.dmi")
return 1
else
return 0
/obj/mecha/micro/sec/go_out()
if(src.occupant && src.occupant.client)
src.occupant.client.mouse_pointer_icon = initial(src.occupant.client.mouse_pointer_icon)
..()
return
/obj/mecha/micro/sec/polecat //figured give 'em the names of small predatory critters
desc = "A hardened security vehicle for micro crewmembers. To them, it's a superheavy tank. To everyone else, it's kinda cute."
name = "Polecat"
icon_state = "polecat"
initial_icon = "polecat"
step_in = 2 // human running speed
dir_in = 2 //Facing south.
health = 150
step_energy_drain = 4 // less efficient than base micromech, but still a micromech.
deflect_chance = 10
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 15000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/polecat
internal_damage_threshold = 35
max_equip = 3
/obj/effect/decal/mecha_wreckage/micro/sec/polecat
name = "Polecat wreckage"
icon_state = "polecat-broken"
/obj/mecha/micro/sec/weasel
desc = "A light scout exosuit for micro crewmembers, built for fast reconnaisance."
name = "Weasel"
icon_state = "weasel"
initial_icon = "weasel"
step_in = 1 // zoom zoom
dir_in = 2 //Facing south.
health = 100
deflect_chance = 5
damage_absorption = list("brute"=1,"fire"=1,"bullet"=0.9,"laser"=0.8,"energy"=0.85,"bomb"=1)
max_temperature = 5000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/weasel
internal_damage_threshold = 20
max_equip = 2
/obj/effect/decal/mecha_wreckage/micro/sec/weasel
name = "Weasel wreckage"
icon_state = "weasel-broken"

View File

@@ -0,0 +1,24 @@
/obj/mecha/micro/utility/gopher //small digging creature, to keep the theme
desc = "A tough little utility mech for micro crewmembers, based on a miner borg chassis."
name = "Gopher"
icon_state = "gopher"
initial_icon = "gopher"
step_in = 3
dir_in = 2 //Facing south.
health = 100
deflect_chance = 10
damage_absorption = list("brute"=0.9,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
max_temperature = 15000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/utility/gopher
internal_damage_threshold = 35
max_equip = 2
/obj/effect/decal/mecha_wreckage/micro/utility/gopher
name = "Gopher wreckage"
icon_state = "gopher-broken"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 864 B

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
icons/mecha/micro.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -725,6 +725,10 @@
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\micro\micro.dm"
#include "code\game\mecha\micro\micro_equipment.dm"
#include "code\game\mecha\micro\security.dm"
#include "code\game\mecha\micro\utility.dm"
#include "code\game\mecha\working\hoverpod.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"