Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Initialize(mapload)
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
/obj/vehicle/sealed/mecha/combat
|
||||
force = 30
|
||||
internals_req_access = list(ACCESS_ROBOTICS, ACCESS_SECURITY)
|
||||
internal_damage_threshold = 50
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
|
||||
destruction_sleep_duration = 40
|
||||
exit_delay = 40
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/restore_equipment()
|
||||
mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
|
||||
. = ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this
|
||||
for(var/obj/item/I in equipment)
|
||||
if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/))
|
||||
var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I
|
||||
gun.projectiles_cache = gun.projectiles_cache_max
|
||||
@@ -0,0 +1,241 @@
|
||||
/obj/vehicle/sealed/mecha/combat/durand
|
||||
desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
|
||||
name = "\improper Durand"
|
||||
icon_state = "durand"
|
||||
movedelay = 4
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 400
|
||||
deflect_chance = 20
|
||||
armor = list(MELEE = 40, BULLET = 35, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 50, FIRE = 100, ACID = 100)
|
||||
max_temperature = 30000
|
||||
force = 40
|
||||
wreckage = /obj/structure/mecha_wreckage/durand
|
||||
var/obj/durand_shield/shield
|
||||
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/Initialize()
|
||||
. = ..()
|
||||
shield = new /obj/durand_shield(loc, src, layer, dir)
|
||||
RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/relay)
|
||||
RegisterSignal(src, COMSIG_PROJECTILE_PREHIT, .proc/prehit)
|
||||
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/Destroy()
|
||||
if(shield)
|
||||
QDEL_NULL(shield)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/generate_actions()
|
||||
. = ..()
|
||||
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_defense_mode)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/process()
|
||||
. = ..()
|
||||
if(defense_mode && !use_power(100)) //Defence mode can only be on with a occupant so we check if one of them can toggle it and toggle
|
||||
for(var/O in occupants)
|
||||
var/mob/living/occupant = O
|
||||
var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode)
|
||||
if(action)
|
||||
INVOKE_ASYNC(action, /datum/action.proc/Trigger)
|
||||
break
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/Move(direction)
|
||||
. = ..()
|
||||
if(shield)
|
||||
shield.forceMove(loc)
|
||||
shield.setDir(dir)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/forceMove(turf/T)
|
||||
. = ..()
|
||||
shield.forceMove(T)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/mob_exit(mob/M, silent, randomstep, forced)
|
||||
if(defense_mode)
|
||||
var/datum/action/action = LAZYACCESSASSOC(occupant_actions, M, /datum/action/vehicle/sealed/mecha/mech_defense_mode)
|
||||
if(action)
|
||||
INVOKE_ASYNC(action, /datum/action.proc/Trigger, FALSE)
|
||||
return ..()
|
||||
|
||||
///Relays the signal from the action button to the shield, and creates a new shield if the old one is MIA.
|
||||
/obj/vehicle/sealed/mecha/combat/durand/proc/relay(datum/source, mob/owner, list/signal_args)
|
||||
SIGNAL_HANDLER
|
||||
if(!shield) //if the shield somehow got deleted
|
||||
stack_trace("Durand triggered relay without a shield")
|
||||
shield = new /obj/durand_shield(loc, src, layer)
|
||||
shield.setDir(dir)
|
||||
SEND_SIGNAL(shield, COMSIG_MECHA_ACTION_TRIGGER, owner, signal_args)
|
||||
|
||||
//Redirects projectiles to the shield if defense_check decides they should be blocked and returns true.
|
||||
/obj/vehicle/sealed/mecha/combat/durand/proc/prehit(obj/item/projectile/source, list/signal_args)
|
||||
if(defense_check(source.loc) && shield)
|
||||
signal_args[2] = shield
|
||||
|
||||
|
||||
/**Checks if defense mode is enabled, and if the attacker is standing in an area covered by the shield.
|
||||
Expects a turf. Returns true if the attack should be blocked, false if not.*/
|
||||
/obj/vehicle/sealed/mecha/combat/durand/proc/defense_check(turf/aloc)
|
||||
if (!defense_mode || !shield || shield.switching)
|
||||
return FALSE
|
||||
. = FALSE
|
||||
switch(dir)
|
||||
if (1)
|
||||
if(abs(x - aloc.x) <= (y - aloc.y) * -2)
|
||||
. = TRUE
|
||||
if (2)
|
||||
if(abs(x - aloc.x) <= (y - aloc.y) * 2)
|
||||
. = TRUE
|
||||
if (4)
|
||||
if(abs(y - aloc.y) <= (x - aloc.x) * -2)
|
||||
. = TRUE
|
||||
if (8)
|
||||
if(abs(y - aloc.y) <= (x - aloc.x) * 2)
|
||||
. = TRUE
|
||||
return
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0)
|
||||
if(defense_check(user.loc))
|
||||
log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange")
|
||||
shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/blob_act(obj/structure/blob/B)
|
||||
if(defense_check(B.loc))
|
||||
log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red")
|
||||
log_message("Attack absorbed by defense field.", LOG_MECHA, color="orange")
|
||||
shield.blob_act(B)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(defense_check(user.loc))
|
||||
log_message("Attack absorbed by defense field. Attacker - [user], with [W]", LOG_MECHA, color="orange")
|
||||
shield.attackby(W, user, params)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/durand/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
|
||||
if(defense_check(AM.loc))
|
||||
log_message("Impact with [AM] absorbed by defense field.", LOG_MECHA, color="orange")
|
||||
shield.hitby(AM, skipcatch, hitpush, blocked, throwingdatum)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
////////////////////////////
|
||||
///// Shield processing ////
|
||||
////////////////////////////
|
||||
|
||||
/**An object to take the hit for us when using the Durand's defense mode.
|
||||
It is spawned in during the durand's initilization, and always stays on the same tile.
|
||||
Normally invisible, until defense mode is actvated. When the durand detects an attack that should be blocked, the
|
||||
attack is passed to the shield. The shield takes the damage, uses it to calculate charge cost, and then sets its
|
||||
own integrity back to max. Shield is automatically dropped if we run out of power or the user gets out.*/
|
||||
|
||||
/obj/durand_shield //projectiles get passed to this when defense mode is enabled
|
||||
name = "defense grid"
|
||||
icon = 'icons/mecha/durand_shield.dmi'
|
||||
icon_state = "shield_null"
|
||||
invisibility = INVISIBILITY_MAXIMUM //no showing on right-click
|
||||
pixel_y = 4
|
||||
max_integrity = 10000
|
||||
obj_integrity = 10000
|
||||
anchored = TRUE
|
||||
light_range = MINIMUM_USEFUL_LIGHT_RANGE
|
||||
light_power = 5
|
||||
light_color = COLOR_CYAN
|
||||
///Our link back to the durand
|
||||
var/obj/vehicle/sealed/mecha/combat/durand/chassis
|
||||
///To keep track of things during the animation
|
||||
var/switching = FALSE
|
||||
var/currentuser
|
||||
|
||||
|
||||
/obj/durand_shield/Initialize(mapload, _chassis, _layer, _dir)
|
||||
. = ..()
|
||||
chassis = _chassis
|
||||
layer = _layer
|
||||
setDir(_dir)
|
||||
RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, .proc/activate)
|
||||
|
||||
|
||||
/obj/durand_shield/Destroy()
|
||||
if(chassis)
|
||||
chassis.shield = null
|
||||
chassis = null
|
||||
return ..()
|
||||
|
||||
/**
|
||||
*Handles activating and deactivating the shield. This proc is called by a signal sent from the mech's action button
|
||||
*and relayed by the mech itself. The "forced" variabe, signal_args[1], will skip the to-pilot text and is meant for when
|
||||
*the shield is disabled by means other than the action button (like running out of power)
|
||||
* Arguments:
|
||||
* * source: the shield
|
||||
* * owner: mob that activated the shield
|
||||
* * signal_args: whether it's forced
|
||||
*/
|
||||
/obj/durand_shield/proc/activate(datum/source, mob/owner, list/signal_args)
|
||||
SIGNAL_HANDLER
|
||||
currentuser = owner
|
||||
if(!chassis?.occupants)
|
||||
return
|
||||
if(switching && !signal_args[1])
|
||||
return
|
||||
if(!chassis.defense_mode && (!chassis.cell || chassis.cell.charge < 100)) //If it's off, and we have less than 100 units of power
|
||||
to_chat(currentuser, "[icon2html(src, currentuser)]<span class='warn'>Insufficient power; cannot activate defense mode.</span>")
|
||||
return
|
||||
switching = TRUE
|
||||
chassis.defense_mode = !chassis.defense_mode
|
||||
if(!signal_args[1])
|
||||
to_chat(currentuser, "[icon2html(src, currentuser)]<span class='notice'>Defense mode [chassis.defense_mode?"enabled":"disabled"].</span>")
|
||||
chassis.log_message("User has toggled defense mode -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA)
|
||||
else
|
||||
chassis.log_message("defense mode state changed -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA)
|
||||
for(var/occupant in chassis.occupants)
|
||||
var/datum/action/button = chassis.occupant_actions[occupant][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
|
||||
button.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]"
|
||||
button.UpdateButtonIcon()
|
||||
|
||||
set_light(light_range, light_power, light_color)
|
||||
|
||||
if(chassis.defense_mode)
|
||||
invisibility = 0
|
||||
flick("shield_raise", src)
|
||||
playsound(src, 'sound/mecha/mech_shield_raise.ogg', 50, FALSE)
|
||||
set_light(l_range = MINIMUM_USEFUL_LIGHT_RANGE , l_power = 5, l_color = "#00FFFF")
|
||||
icon_state = "shield"
|
||||
RegisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE, .proc/resetdir)
|
||||
else
|
||||
flick("shield_drop", src)
|
||||
playsound(src, 'sound/mecha/mech_shield_drop.ogg', 50, FALSE)
|
||||
set_light(0)
|
||||
icon_state = "shield_null"
|
||||
invisibility = INVISIBILITY_MAXIMUM //no showing on right-click
|
||||
UnregisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE)
|
||||
switching = FALSE
|
||||
|
||||
/obj/durand_shield/proc/resetdir(datum/source, olddir, newdir)
|
||||
setDir(newdir)
|
||||
|
||||
/obj/durand_shield/take_damage()
|
||||
if(!chassis)
|
||||
qdel(src)
|
||||
return
|
||||
if(!chassis.defense_mode) //if defense mode is disabled, we're taking damage that we shouldn't be taking
|
||||
return
|
||||
. = ..()
|
||||
flick("shield_impact", src)
|
||||
if(!chassis.use_power((max_integrity - obj_integrity) * 100))
|
||||
chassis.cell?.charge = 0
|
||||
for(var/O in chassis.occupants)
|
||||
var/mob/living/occupant = O
|
||||
var/datum/action/action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode)
|
||||
action.Trigger(FALSE)
|
||||
obj_integrity = 10000
|
||||
|
||||
/obj/durand_shield/play_attack_sound()
|
||||
playsound(src, 'sound/mecha/mech_shield_deflect.ogg', 100, TRUE)
|
||||
|
||||
/obj/durand_shield/bullet_act()
|
||||
play_attack_sound()
|
||||
. = ..()
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/vehicle/sealed/mecha/combat/five_stars
|
||||
desc = "A state of the art tank deployed by the Spinward Stellar Coalition National Guard."
|
||||
name = "\improper Tank"
|
||||
icon = 'icons/mecha/mecha_96x96.dmi'
|
||||
icon_state = "five_stars"
|
||||
armor = list(MELEE = 100, BULLET = 50, LASER = 35, ENERGY = 35, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
step_in = 4
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 800
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/five_stars/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
max_ammo()
|
||||
@@ -0,0 +1,59 @@
|
||||
/obj/vehicle/sealed/mecha/combat/gygax
|
||||
desc = "A lightweight, security exosuit. Popular among private and corporate security."
|
||||
name = "\improper Gygax"
|
||||
icon_state = "gygax"
|
||||
allow_diagonal_movement = TRUE
|
||||
movedelay = 3
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 250
|
||||
deflect_chance = 5
|
||||
armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
max_temperature = 25000
|
||||
leg_overload_coeff = 80
|
||||
force = 25
|
||||
wreckage = /obj/structure/mecha_wreckage/gygax
|
||||
internal_damage_threshold = 35
|
||||
max_equip = 3
|
||||
step_energy_drain = 3
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/gygax/dark
|
||||
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
|
||||
name = "\improper Dark Gygax"
|
||||
icon_state = "darkgygax"
|
||||
max_integrity = 300
|
||||
deflect_chance = 20
|
||||
armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD =20, FIRE = 100, ACID = 100)
|
||||
max_temperature = 35000
|
||||
leg_overload_coeff = 70
|
||||
force = 30
|
||||
operation_req_access = list(ACCESS_SYNDICATE)
|
||||
internals_req_access = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/gygax/dark
|
||||
max_equip = 5
|
||||
destruction_sleep_duration = 20
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
|
||||
ME.attach(src)
|
||||
max_ammo()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null)
|
||||
if(C)
|
||||
C.forceMove(src)
|
||||
cell = C
|
||||
return
|
||||
cell = new /obj/item/stock_parts/cell/bluespace(src)
|
||||
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/gygax/generate_actions()
|
||||
. = ..()
|
||||
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overload_mode)
|
||||
@@ -0,0 +1,167 @@
|
||||
/obj/vehicle/sealed/mecha/combat/honker
|
||||
desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!"
|
||||
name = "\improper H.O.N.K"
|
||||
icon_state = "honker"
|
||||
movedelay = 3
|
||||
max_integrity = 140
|
||||
deflect_chance = 60
|
||||
internal_damage_threshold = 60
|
||||
armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
max_temperature = 25000
|
||||
operation_req_access = list(ACCESS_THEATRE)
|
||||
internals_req_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE)
|
||||
wreckage = /obj/structure/mecha_wreckage/honker
|
||||
mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS
|
||||
max_equip = 3
|
||||
var/squeak = TRUE
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/honker/get_stats_part(mob/user)
|
||||
var/integrity = obj_integrity/max_integrity*100
|
||||
var/cell_charge = get_charge()
|
||||
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
|
||||
var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None"
|
||||
var/tank_temperature = internal_tank ? int_tank_air.return_temperature() : "Unknown"
|
||||
var/cabin_pressure = round(return_pressure(),0.01)
|
||||
var/output = {"[report_internal_damage()]
|
||||
[integrity<30?"<font color='red'><b>DAMAGE LEVEL CRITICAL</b></font><br>":null]
|
||||
[internal_damage&MECHA_INT_TEMP_CONTROL?"<font color='red'><b>CLOWN SUPPORT SYSTEM MALFUNCTION</b></font><br>":null]
|
||||
[internal_damage&MECHA_INT_TANK_BREACH?"<font color='red'><b>GAS TANK HONK</b></font><br>":null]
|
||||
[internal_damage&MECHA_INT_CONTROL_LOST?"<font color='red'><b>HONK-A-DOODLE</b></font> - <a href='?src=[REF(src)];repair_int_control_lost=1'>Recalibrate</a><br>":null]
|
||||
<b>IntegriHONK: </b> [integrity]%<br>
|
||||
<b>PowerHONK charge: </b>[isnull(cell_charge)?"No power cell installed":"[cell.percent()]%"]<br>
|
||||
<b>Air source: </b>[use_internal_tank?"Internal Airtank":"Environment"]<br>
|
||||
<b>AirHONK pressure: </b>[tank_pressure]kPa<br>
|
||||
<b>AirHONK temperature: </b>[tank_temperature]°K|[tank_temperature - T0C]°C<br>
|
||||
<b>HONK pressure: </b>[cabin_pressure>WARNING_HIGH_PRESSURE ? "<font color='red'>[cabin_pressure]</font>": cabin_pressure]kPa<br>
|
||||
<b>HONK temperature: </b> [return_temperature()]°K|[return_temperature() - T0C]°C<br>
|
||||
<b>Lights: </b>[(mecha_flags & LIGHTS_ON)?"on":"off"]<br>
|
||||
[dna_lock?"<b>DNA-locked:</b><br> <span style='font-size:10px;letter-spacing:-1px;'>[dna_lock]</span> \[<a href='?src=[REF(src)];reset_dna=1'>Reset</a>\]<br>":null]
|
||||
"}
|
||||
return output
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/honker/get_stats_html(mob/user)
|
||||
var/output = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>[src.name] data</title>
|
||||
<style>
|
||||
body {color: #00ff00; background: #32CD32; font-family:"Courier",monospace; font-size: 12px;}
|
||||
hr {border: 1px solid #0f0; color: #fff; background-color: #000;}
|
||||
a {padding:2px 5px;;color:#0f0;}
|
||||
.wr {margin-bottom: 5px;}
|
||||
.header {cursor:pointer;}
|
||||
.open, .closed {background: #32CD32; color:#000; padding:1px 2px;}
|
||||
.links a {margin-bottom: 2px;padding-top:3px;}
|
||||
.visible {display: block;}
|
||||
.hidden {display: none;}
|
||||
</style>
|
||||
<script language='javascript' type='text/javascript'>
|
||||
[js_byjax]
|
||||
[js_dropdowns]
|
||||
function SSticker() {
|
||||
setInterval(function(){
|
||||
window.location='byond://?src=[REF(src)]&update_content=1';
|
||||
document.body.style.color = get_rand_color_string();
|
||||
document.body.style.background = get_rand_color_string();
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
function get_rand_color_string() {
|
||||
var color = new Array;
|
||||
for(var i=0;i<3;i++){
|
||||
color.push(Math.floor(Math.random()*255));
|
||||
}
|
||||
return "rgb("+color.toString()+")";
|
||||
}
|
||||
|
||||
window.onload = function() {
|
||||
dropdowns();
|
||||
SSticker();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id='content'>
|
||||
[src.get_stats_part(user)]
|
||||
</div>
|
||||
<div id='eq_list'>
|
||||
[src.get_equipment_list()]
|
||||
</div>
|
||||
<hr>
|
||||
<div id='commands'>
|
||||
[src.get_commands()]
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
return output
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/honker/get_commands()
|
||||
var/output = {"<div class='wr'>
|
||||
<div class='header'>Sounds of HONK:</div>
|
||||
<div class='links'>
|
||||
<a href='?src=[REF(src)];play_sound=sadtrombone'>Sad Trombone</a>
|
||||
<a href='?src=[REF(src)];play_sound=bikehorn'>Bike Horn</a>
|
||||
<a href='?src=[REF(src)];play_sound=airhorn2'>Air Horn</a>
|
||||
<a href='?src=[REF(src)];play_sound=carhorn'>Car Horn</a>
|
||||
<a href='?src=[REF(src)];play_sound=party_horn'>Party Horn</a>
|
||||
<a href='?src=[REF(src)];play_sound=reee'>Reee</a>
|
||||
<a href='?src=[REF(src)];play_sound=weeoo1'>Siren</a>
|
||||
<a href='?src=[REF(src)];play_sound=hiss1'>Hissing Creature</a>
|
||||
<a href='?src=[REF(src)];play_sound=armbomb'>Armed Grenade</a>
|
||||
<a href='?src=[REF(src)];play_sound=saberon'>Energy Sword</a>
|
||||
<a href='?src=[REF(src)];play_sound=airlock_alien_prying'>Airlock Prying</a>
|
||||
<a href='?src=[REF(src)];play_sound=lightningbolt'>Lightning Bolt</a>
|
||||
<a href='?src=[REF(src)];play_sound=explosionfar'>Distant Explosion</a>
|
||||
</div>
|
||||
</div>
|
||||
"}
|
||||
output += ..()
|
||||
return output
|
||||
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/honker/get_equipment_list()
|
||||
if(!LAZYLEN(equipment))
|
||||
return
|
||||
var/output = "<b>Honk-ON-Systems:</b><div style=\"margin-left: 15px;\">"
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment)
|
||||
output += "<div id='[REF(MT)]'>[MT.get_equip_info()]</div>"
|
||||
output += "</div>"
|
||||
return output
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/honker/play_stepsound()
|
||||
if(squeak)
|
||||
playsound(src, "clownstep", 70, 1)
|
||||
squeak = !squeak
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/honker/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["play_sound"])
|
||||
switch(href_list["play_sound"])
|
||||
if("sadtrombone")
|
||||
playsound(src, 'sound/misc/sadtrombone.ogg', 50)
|
||||
if("bikehorn")
|
||||
playsound(src, 'sound/items/bikehorn.ogg', 50)
|
||||
if("airhorn2")
|
||||
playsound(src, 'sound/items/airhorn2.ogg', 40) //soundfile has higher than average volume
|
||||
if("carhorn")
|
||||
playsound(src, 'sound/items/carhorn.ogg', 80) //soundfile has lower than average volume
|
||||
if("party_horn")
|
||||
playsound(src, 'sound/items/party_horn.ogg', 50)
|
||||
if("reee")
|
||||
playsound(src, 'sound/effects/reee.ogg', 50)
|
||||
if("weeoo1")
|
||||
playsound(src, 'sound/items/weeoo1.ogg', 50)
|
||||
if("hiss1")
|
||||
playsound(src, 'sound/voice/hiss1.ogg', 50)
|
||||
if("armbomb")
|
||||
playsound(src, 'sound/weapons/armbomb.ogg', 50)
|
||||
if("saberon")
|
||||
playsound(src, 'sound/weapons/saberon.ogg', 50)
|
||||
if("airlock_alien_prying")
|
||||
playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50)
|
||||
if("lightningbolt")
|
||||
playsound(src, 'sound/magic/lightningbolt.ogg', 50)
|
||||
if("explosionfar")
|
||||
playsound(src, 'sound/effects/explosionfar.ogg', 50)
|
||||
return
|
||||
@@ -0,0 +1,97 @@
|
||||
/obj/vehicle/sealed/mecha/combat/marauder
|
||||
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
|
||||
name = "\improper Marauder"
|
||||
icon_state = "marauder"
|
||||
movedelay = 5
|
||||
max_integrity = 500
|
||||
deflect_chance = 25
|
||||
armor = list(MELEE = 50, BULLET = 55, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 60, FIRE = 100, ACID = 100)
|
||||
max_temperature = 60000
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
operation_req_access = list(ACCESS_CENT_SPECOPS)
|
||||
internals_req_access = list(ACCESS_CENT_SPECOPS)
|
||||
wreckage = /obj/structure/mecha_wreckage/marauder
|
||||
mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS
|
||||
internal_damage_threshold = 25
|
||||
force = 45
|
||||
max_equip = 5
|
||||
bumpsmash = TRUE
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/generate_actions()
|
||||
. = ..()
|
||||
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_smoke)
|
||||
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_zoom)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/loaded/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
max_ammo()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/seraph
|
||||
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
||||
name = "\improper Seraph"
|
||||
icon_state = "seraph"
|
||||
operation_req_access = list(ACCESS_CENT_SPECOPS)
|
||||
internals_req_access = list(ACCESS_CENT_SPECOPS)
|
||||
movedelay = 3
|
||||
max_integrity = 550
|
||||
wreckage = /obj/structure/mecha_wreckage/seraph
|
||||
internal_damage_threshold = 20
|
||||
force = 55
|
||||
max_equip = 6
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/seraph/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
max_ammo()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/mauler
|
||||
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
|
||||
name = "\improper Mauler"
|
||||
icon_state = "mauler"
|
||||
operation_req_access = list(ACCESS_SYNDICATE)
|
||||
internals_req_access = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/mauler
|
||||
max_equip = 6
|
||||
destruction_sleep_duration = 20
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/mauler/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src)
|
||||
ME.attach(src)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
max_ammo()
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/obj/vehicle/sealed/mecha/medical/medigax
|
||||
desc = "A Gygax with it's actuator overload stripped and a slick white paint scheme, for medical use, These exosuits are developed and produced by Vey-Med. (© All rights reserved)."
|
||||
name = "\improper Medical Gygax"
|
||||
icon_state = "medigax"
|
||||
allow_diagonal_movement = TRUE
|
||||
movedelay = 2
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 250
|
||||
deflect_chance = 15
|
||||
armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
max_temperature = 25000
|
||||
wreckage = /obj/structure/mecha_wreckage/odysseus
|
||||
internal_damage_threshold = 35
|
||||
step_energy_drain = 6
|
||||
infra_luminosity = 6
|
||||
internals_req_access = list(ACCESS_ROBOTICS, ACCESS_MEDICAL)
|
||||
|
||||
/obj/vehicle/sealed/mecha/medical/medigax/moved_inside(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
hud.add_hud_to(H)
|
||||
|
||||
/obj/vehicle/sealed/mecha/medical/medigax/remove_occupant(mob/M)
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
hud.remove_hud_from(L)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/medical/medigax/mmi_moved_inside(obj/item/mmi/M, mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
var/mob/living/brain/B = M.brainmob
|
||||
hud.add_hud_to(B)
|
||||
@@ -0,0 +1,102 @@
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre
|
||||
name = "Neovgre, the Anima Bulwark"
|
||||
desc = "Nezbere's most powerful creation, a mighty war machine of unmatched power said to have ended wars in a single night. Armed with a heavy laser and a tesla sphere generator. Requires a pilot and a gunner."
|
||||
icon = 'icons/mecha/neovgre.dmi'
|
||||
icon_state = "neovgre"
|
||||
max_integrity = 500 //This is THE ratvarian superweaon, its deployment is an investment
|
||||
armor = list(MELEE = 50, BULLET = 40, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!!
|
||||
force = 50 //SMASHY SMASHY!!
|
||||
movedelay = 3
|
||||
internal_damage_threshold = 0
|
||||
pixel_x = -16
|
||||
layer = ABOVE_MOB_LAYER
|
||||
var/breach_time = 100 //ten seconds till all goes to shit
|
||||
var/recharge_rate = 100
|
||||
internals_req_access = list()
|
||||
wreckage = /obj/structure/mecha_wreckage/durand/neovgre
|
||||
stepsound = 'sound/mecha/neostep2.ogg'
|
||||
turnsound = 'sound/mecha/powerloader_step.ogg'
|
||||
max_occupants = 2
|
||||
|
||||
//override this proc if you need to split up mecha control between multiple people (see savannah_ivanov.dm)
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/auto_assign_occupant_flags(mob/M)
|
||||
if(driver_amount() < max_drivers)
|
||||
add_control_flags(M, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS)
|
||||
else
|
||||
add_control_flags(M, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/mob_exit(mob/M, silent, forced)
|
||||
if(forced)
|
||||
..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/MouseDrop_T(mob/M, mob/user)
|
||||
if(!is_servant_of_ratvar(user))
|
||||
to_chat(user, "<span class='neovgre'>BEGONE HEATHEN!</span>")
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/moved_inside(mob/living/carbon/human/H)
|
||||
var/list/Itemlist = H.get_contents()
|
||||
for(var/obj/item/clockwork/slab/W in Itemlist)
|
||||
to_chat(H, "<span class='brass'>You safely store [W] inside [src].</span>")
|
||||
qdel(W)
|
||||
. = ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/obj_destruction()
|
||||
for(var/mob/M in src)
|
||||
to_chat(M, "<span class='brass'>You are consumed by the fires raging within Neovgre...</span>")
|
||||
M.dust()
|
||||
playsound(src, 'sound/effects/neovgre_exploding.ogg', 100, 0)
|
||||
src.visible_message("<span class = 'userdanger'>The reactor has gone critical, its going to blow!</span>")
|
||||
addtimer(CALLBACK(src,.proc/go_critical),breach_time)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/proc/go_critical()
|
||||
explosion(get_turf(loc), 3, 5, 10, 20, 30)
|
||||
Destroy(src)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/container_resist(mob/living/user)
|
||||
to_chat(user, "<span class='brass'>Neovgre requires a lifetime commitment friend, no backing out now!</span>")
|
||||
return
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/process()
|
||||
..()
|
||||
if(!obj_integrity) //Integrity is zero but we would heal out of that state if we went into this before it recognises it being zero
|
||||
return
|
||||
if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hope to stop the superweapon
|
||||
cell.charge = INFINITY
|
||||
max_integrity = INFINITY
|
||||
obj_integrity = max_integrity
|
||||
else
|
||||
if(cell.charge < cell.maxcharge)
|
||||
for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src))
|
||||
var/delta = min(recharge_rate, cell.maxcharge - cell.charge)
|
||||
if (get_clockwork_power() >= delta)
|
||||
cell.charge += delta
|
||||
adjust_clockwork_power(-delta)
|
||||
if(obj_integrity < max_integrity && istype(loc, /turf/open/floor/clockwork))
|
||||
obj_integrity += min(max_integrity - obj_integrity, max_integrity / 200)
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/neovgre/Initialize(mapload)
|
||||
.=..()
|
||||
GLOB.neovgre_exists ++
|
||||
var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new
|
||||
N.attach(src)
|
||||
var/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla/shocking = new
|
||||
shocking.attach(src)
|
||||
|
||||
/obj/structure/mecha_wreckage/durand/neovgre
|
||||
name = "\improper Neovgre wreckage?"
|
||||
desc = "On closer inspection this looks like the wreck of a durand with some spraypainted cardboard duct taped to it!"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre
|
||||
equip_cooldown = 8 //Rapid fire heavy laser cannon, simple yet elegant
|
||||
energy_drain = 30
|
||||
name = "Arbiter Laser Cannon"
|
||||
desc = "Please re-attach this to neovgre and stop asking questions about why it looks like a normal Nanotrasen issue Solaris laser cannon - Nezbere"
|
||||
fire_sound = 'sound/weapons/neovgre_laser.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/vehicle/sealed/mecha/combat/neovgre/M)
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/vehicle/sealed/mecha/combat/phazon
|
||||
desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials."
|
||||
name = "\improper Phazon"
|
||||
icon_state = "phazon"
|
||||
movedelay = 2
|
||||
dir_in = 2 //Facing South.
|
||||
step_energy_drain = 3
|
||||
max_integrity = 200
|
||||
deflect_chance = 30
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 50, FIRE = 100, ACID = 100)
|
||||
max_temperature = 25000
|
||||
wreckage = /obj/structure/mecha_wreckage/phazon
|
||||
internal_damage_threshold = 25
|
||||
force = 15
|
||||
max_equip = 3
|
||||
phase_state = "phazon-phase"
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/phazon/generate_actions()
|
||||
. = ..()
|
||||
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_phasing)
|
||||
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_switch_damtype)
|
||||
@@ -0,0 +1,27 @@
|
||||
/obj/vehicle/sealed/mecha/combat/reticence
|
||||
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
|
||||
name = "\improper reticence"
|
||||
icon_state = "reticence"
|
||||
movedelay = 2
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 100
|
||||
deflect_chance = 3
|
||||
armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
max_temperature = 15000
|
||||
wreckage = /obj/structure/mecha_wreckage/reticence
|
||||
operation_req_access = list(ACCESS_THEATRE)
|
||||
internals_req_access = list(ACCESS_ROBOTICS, ACCESS_THEATRE)
|
||||
mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS
|
||||
internal_damage_threshold = 25
|
||||
max_equip = 2
|
||||
step_energy_drain = 3
|
||||
color = "#87878715"
|
||||
stepsound = null
|
||||
turnsound = null
|
||||
|
||||
/obj/vehicle/sealed/mecha/combat/reticence/loaded/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT
|
||||
ME.attach(src)
|
||||
Reference in New Issue
Block a user