mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-24 21:40:55 +01:00
Merge branch 'dev-freeze' into dev
Conflicts: icons/obj/ammo.dmi
This commit is contained in:
@@ -10,9 +10,6 @@
|
||||
construction_storage
|
||||
name = "\improper Construction storage"
|
||||
|
||||
locker
|
||||
name = "\improper Locker room"
|
||||
|
||||
atmos_storage
|
||||
name = "\improper Atmos storage"
|
||||
icon_state = "engine_storage"
|
||||
@@ -69,7 +66,11 @@
|
||||
//icon_state = "engine_portgyro"
|
||||
|
||||
storage
|
||||
name = "\improper Engineering hallway"
|
||||
name = "\improper Engineering Storage"
|
||||
icon_state = "engine_storage"
|
||||
|
||||
storage_hard
|
||||
name = "\improper Engineering Hard Storage"
|
||||
icon_state = "engine_storage"
|
||||
|
||||
hallway
|
||||
|
||||
@@ -14,67 +14,67 @@
|
||||
#define WARNING_DELAY 60 //45 seconds between warnings.
|
||||
|
||||
/obj/machinery/power/supermatter
|
||||
name = "Supermatter"
|
||||
desc = "A strangely translucent and iridescent crystal. \red You get headaches just from looking at it."
|
||||
icon = 'icons/obj/engine.dmi'
|
||||
icon_state = "darkmatter"
|
||||
density = 1
|
||||
anchored = 0
|
||||
name = "Supermatter"
|
||||
desc = "A strangely translucent and iridescent crystal. \red You get headaches just from looking at it."
|
||||
icon = 'icons/obj/engine.dmi'
|
||||
icon_state = "darkmatter"
|
||||
density = 1
|
||||
anchored = 0
|
||||
|
||||
var/gasefficency = 0.25
|
||||
var/gasefficency = 0.25
|
||||
|
||||
var/base_icon_state = "darkmatter"
|
||||
var/base_icon_state = "darkmatter"
|
||||
|
||||
var/damage = 0
|
||||
var/damage_archived = 0
|
||||
var/safe_alert = "Crystaline hyperstructure returning to safe operating levels."
|
||||
var/warning_point = 100
|
||||
var/warning_alert = "Danger! Crystal hyperstructure instability!"
|
||||
var/emergency_point = 700
|
||||
var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
|
||||
var/explosion_point = 1000
|
||||
var/damage = 0
|
||||
var/damage_archived = 0
|
||||
var/safe_alert = "Crystaline hyperstructure returning to safe operating levels."
|
||||
var/warning_point = 100
|
||||
var/warning_alert = "Danger! Crystal hyperstructure instability!"
|
||||
var/emergency_point = 700
|
||||
var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
|
||||
var/explosion_point = 1000
|
||||
|
||||
var/emergency_issued = 0
|
||||
var/emergency_issued = 0
|
||||
|
||||
var/explosion_power = 8
|
||||
var/explosion_power = 8
|
||||
|
||||
var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
|
||||
var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
|
||||
|
||||
var/power = 0
|
||||
var/power = 0
|
||||
|
||||
//Temporary values so that we can optimize this
|
||||
//How much the bullets damage should be multiplied by when it is added to the internal variables
|
||||
var/config_bullet_energy = 2
|
||||
//How much of the power is left after processing is finished?
|
||||
//Temporary values so that we can optimize this
|
||||
//How much the bullets damage should be multiplied by when it is added to the internal variables
|
||||
var/config_bullet_energy = 2
|
||||
//How much of the power is left after processing is finished?
|
||||
// var/config_power_reduction_per_tick = 0.5
|
||||
//How much hallucination should it produce per unit of power?
|
||||
var/config_hallucination_power = 0.1
|
||||
//How much hallucination should it produce per unit of power?
|
||||
var/config_hallucination_power = 0.1
|
||||
|
||||
var/obj/item/device/radio/radio
|
||||
var/obj/item/device/radio/radio
|
||||
|
||||
shard //Small subtype, less efficient and more sensitive, but less boom.
|
||||
name = "Supermatter Shard"
|
||||
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
|
||||
icon_state = "darkmatter_shard"
|
||||
base_icon_state = "darkmatter_shard"
|
||||
shard //Small subtype, less efficient and more sensitive, but less boom.
|
||||
name = "Supermatter Shard"
|
||||
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it."
|
||||
icon_state = "darkmatter_shard"
|
||||
base_icon_state = "darkmatter_shard"
|
||||
|
||||
warning_point = 50
|
||||
emergency_point = 500
|
||||
explosion_point = 900
|
||||
warning_point = 50
|
||||
emergency_point = 500
|
||||
explosion_point = 900
|
||||
|
||||
gasefficency = 0.125
|
||||
gasefficency = 0.125
|
||||
|
||||
explosion_power = 3 //3,6,9,12? Or is that too small?
|
||||
explosion_power = 3 //3,6,9,12? Or is that too small?
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/New()
|
||||
. = ..()
|
||||
radio = new (src)
|
||||
. = ..()
|
||||
radio = new (src)
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/Del()
|
||||
del radio
|
||||
. = ..()
|
||||
del radio
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/power/supermatter/proc/explode()
|
||||
explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1)
|
||||
@@ -83,129 +83,132 @@
|
||||
|
||||
/obj/machinery/power/supermatter/process()
|
||||
|
||||
var/turf/L = loc
|
||||
var/turf/L = loc
|
||||
|
||||
if(!istype(L)) //If we are not on a turf, uh oh.
|
||||
del src
|
||||
if(isnull(L)) // We have a null turf...something is wrong, stop processing this entity.
|
||||
return PROCESS_KILL
|
||||
|
||||
//Ok, get the air from the turf
|
||||
var/datum/gas_mixture/env = L.return_air()
|
||||
if(!istype(L)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now.
|
||||
return //Yeah just stop.
|
||||
|
||||
//Remove gas from surrounding area
|
||||
var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles)
|
||||
//Ok, get the air from the turf
|
||||
var/datum/gas_mixture/env = L.return_air()
|
||||
|
||||
if(!removed || !removed.total_moles)
|
||||
damage += max((power-1600)/10, 0)
|
||||
power = min(power, 1600)
|
||||
return 1
|
||||
//Remove gas from surrounding area
|
||||
var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles)
|
||||
|
||||
if (!removed)
|
||||
return 1
|
||||
if(!removed || !removed.total_moles)
|
||||
damage += max((power-1600)/10, 0)
|
||||
power = min(power, 1600)
|
||||
return 1
|
||||
|
||||
damage_archived = damage
|
||||
damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
|
||||
if (!removed)
|
||||
return 1
|
||||
|
||||
if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
|
||||
if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
|
||||
damage_archived = damage
|
||||
damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
|
||||
|
||||
if(damage > emergency_point)
|
||||
radio.autosay(emergency_alert, "Supermatter Monitor")
|
||||
lastwarning = world.timeofday
|
||||
if(damage > warning_point) // while the core is still damaged and it's still worth noting its status
|
||||
if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY)
|
||||
|
||||
else if(damage >= damage_archived) // The damage is still going up
|
||||
radio.autosay(warning_alert, "Supermatter Monitor")
|
||||
lastwarning = world.timeofday - 150
|
||||
if(damage > emergency_point)
|
||||
radio.autosay(emergency_alert, "Supermatter Monitor")
|
||||
lastwarning = world.timeofday
|
||||
|
||||
else // Phew, we're safe
|
||||
radio.autosay(safe_alert, "Supermatter Monitor")
|
||||
lastwarning = world.timeofday
|
||||
else if(damage >= damage_archived) // The damage is still going up
|
||||
radio.autosay(warning_alert, "Supermatter Monitor")
|
||||
lastwarning = world.timeofday - 150
|
||||
|
||||
if(damage > explosion_point)
|
||||
for(var/mob/living/mob in living_mob_list)
|
||||
if(istype(mob, /mob/living/carbon/human))
|
||||
//Hilariously enough, running into a closet should make you get hit the hardest.
|
||||
mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
|
||||
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
|
||||
mob.apply_effect(rads, IRRADIATE)
|
||||
else // Phew, we're safe
|
||||
radio.autosay(safe_alert, "Supermatter Monitor")
|
||||
lastwarning = world.timeofday
|
||||
|
||||
explode()
|
||||
if(damage > explosion_point)
|
||||
for(var/mob/living/mob in living_mob_list)
|
||||
if(istype(mob, /mob/living/carbon/human))
|
||||
//Hilariously enough, running into a closet should make you get hit the hardest.
|
||||
mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
|
||||
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
|
||||
mob.apply_effect(rads, IRRADIATE)
|
||||
|
||||
//Ok, 100% oxygen atmosphere = best reaction
|
||||
//Maxes out at 100% oxygen pressure
|
||||
var/oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0)
|
||||
explode()
|
||||
|
||||
var/temp_factor = 100
|
||||
//Ok, 100% oxygen atmosphere = best reaction
|
||||
//Maxes out at 100% oxygen pressure
|
||||
var/oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0)
|
||||
|
||||
if(oxygen > 0.8)
|
||||
// with a perfect gas mix, make the power less based on heat
|
||||
icon_state = "[base_icon_state]_glow"
|
||||
else
|
||||
// in normal mode, base the produced energy around the heat
|
||||
temp_factor = 60
|
||||
icon_state = base_icon_state
|
||||
var/temp_factor = 100
|
||||
|
||||
power = max( (removed.temperature * temp_factor / T0C) * oxygen + power, 0) //Total laser power plus an overload
|
||||
if(oxygen > 0.8)
|
||||
// with a perfect gas mix, make the power less based on heat
|
||||
icon_state = "[base_icon_state]_glow"
|
||||
else
|
||||
// in normal mode, base the produced energy around the heat
|
||||
temp_factor = 60
|
||||
icon_state = base_icon_state
|
||||
|
||||
//We've generated power, now let's transfer it to the collectors for storing/usage
|
||||
transfer_energy()
|
||||
power = max( (removed.temperature * temp_factor / T0C) * oxygen + power, 0) //Total laser power plus an overload
|
||||
|
||||
var/device_energy = power * REACTION_POWER_MODIFIER
|
||||
//We've generated power, now let's transfer it to the collectors for storing/usage
|
||||
transfer_energy()
|
||||
|
||||
//To figure out how much temperature to add each tick, consider that at one atmosphere's worth
|
||||
//of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature
|
||||
//that the device energy is around 2140. At that stage, we don't want too much heat to be put out
|
||||
//Since the core is effectively "cold"
|
||||
var/device_energy = power * REACTION_POWER_MODIFIER
|
||||
|
||||
//Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
|
||||
//is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
|
||||
removed.temperature += (device_energy / THERMAL_RELEASE_MODIFIER)
|
||||
//To figure out how much temperature to add each tick, consider that at one atmosphere's worth
|
||||
//of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature
|
||||
//that the device energy is around 2140. At that stage, we don't want too much heat to be put out
|
||||
//Since the core is effectively "cold"
|
||||
|
||||
removed.temperature = max(0, min(removed.temperature, 2500))
|
||||
//Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock
|
||||
//is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall.
|
||||
removed.temperature += (device_energy / THERMAL_RELEASE_MODIFIER)
|
||||
|
||||
//Calculate how much gas to release
|
||||
removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
|
||||
removed.temperature = max(0, min(removed.temperature, 2500))
|
||||
|
||||
removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
|
||||
//Calculate how much gas to release
|
||||
removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0)
|
||||
|
||||
removed.update_values()
|
||||
removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
|
||||
|
||||
env.merge(removed)
|
||||
removed.update_values()
|
||||
|
||||
for(var/mob/living/carbon/human/l in view(src, round(power ** 0.25))) // you have to be seeing the core to get hallucinations
|
||||
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
|
||||
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / get_dist(l, src) ) ) )
|
||||
env.merge(removed)
|
||||
|
||||
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
|
||||
var/rads = (power / 10) * sqrt( 1 / get_dist(l, src) )
|
||||
l.apply_effect(rads, IRRADIATE)
|
||||
for(var/mob/living/carbon/human/l in view(src, round(power ** 0.25))) // you have to be seeing the core to get hallucinations
|
||||
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
|
||||
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / get_dist(l, src) ) ) )
|
||||
|
||||
power -= (power/500)**3
|
||||
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
|
||||
var/rads = (power / 10) * sqrt( 1 / get_dist(l, src) )
|
||||
l.apply_effect(rads, IRRADIATE)
|
||||
|
||||
return 1
|
||||
power -= (power/500)**3
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.flag != "bullet")
|
||||
power += Proj.damage * config_bullet_energy
|
||||
else
|
||||
damage += Proj.damage * config_bullet_energy
|
||||
return 0
|
||||
if(Proj.flag != "bullet")
|
||||
power += Proj.damage * config_bullet_energy
|
||||
else
|
||||
damage += Proj.damage * config_bullet_energy
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/attack_robot(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/attack_hand(mob/user as mob)
|
||||
user.visible_message("<span class=\"warning\">\The [user] reaches out and touches \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.</span>",\
|
||||
"<span class=\"danger\">You reach out and touch \the [src], everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"</span>",\
|
||||
"<span class=\"warning\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>")
|
||||
user.visible_message("<span class=\"warning\">\The [user] reaches out and touches \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.</span>",\
|
||||
"<span class=\"danger\">You reach out and touch \the [src], everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"</span>",\
|
||||
"<span class=\"warning\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>")
|
||||
|
||||
Consume(user)
|
||||
Consume(user)
|
||||
|
||||
/obj/machinery/power/supermatter/proc/transfer_energy()
|
||||
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
|
||||
@@ -214,44 +217,44 @@
|
||||
return
|
||||
|
||||
/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
|
||||
user.visible_message("<span class=\"warning\">\The [user] touches \a [W] to \the [src] as a silence fills the room...</span>",\
|
||||
"<span class=\"danger\">You touch \the [W] to \the [src] when everything suddenly goes silent.\"</span>\n<span class=\"notice\">\The [W] flashes into dust as you flinch away from \the [src].</span>",\
|
||||
"<span class=\"warning\">Everything suddenly goes silent.</span>")
|
||||
user.visible_message("<span class=\"warning\">\The [user] touches \a [W] to \the [src] as a silence fills the room...</span>",\
|
||||
"<span class=\"danger\">You touch \the [W] to \the [src] when everything suddenly goes silent.\"</span>\n<span class=\"notice\">\The [W] flashes into dust as you flinch away from \the [src].</span>",\
|
||||
"<span class=\"warning\">Everything suddenly goes silent.</span>")
|
||||
|
||||
user.drop_from_inventory(W)
|
||||
Consume(W)
|
||||
user.drop_from_inventory(W)
|
||||
Consume(W)
|
||||
|
||||
user.apply_effect(150, IRRADIATE)
|
||||
user.apply_effect(150, IRRADIATE)
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj)
|
||||
if(istype(AM, /mob/living))
|
||||
AM.visible_message("<span class=\"warning\">\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.</span>",\
|
||||
"<span class=\"danger\">You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"</span>",\
|
||||
"<span class=\"warning\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>")
|
||||
else
|
||||
AM.visible_message("<span class=\"warning\">\The [AM] smacks into \the [src] and rapidly flashes to ash.</span>",\
|
||||
"<span class=\"warning\">You hear a loud crack as you are washed with a wave of heat.</span>")
|
||||
if(istype(AM, /mob/living))
|
||||
AM.visible_message("<span class=\"warning\">\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.</span>",\
|
||||
"<span class=\"danger\">You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"</span>",\
|
||||
"<span class=\"warning\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>")
|
||||
else
|
||||
AM.visible_message("<span class=\"warning\">\The [AM] smacks into \the [src] and rapidly flashes to ash.</span>",\
|
||||
"<span class=\"warning\">You hear a loud crack as you are washed with a wave of heat.</span>")
|
||||
|
||||
Consume(AM)
|
||||
Consume(AM)
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter/proc/Consume(var/mob/living/user)
|
||||
if(istype(user))
|
||||
user.dust()
|
||||
power += 200
|
||||
else
|
||||
del user
|
||||
if(istype(user))
|
||||
user.dust()
|
||||
power += 200
|
||||
else
|
||||
del user
|
||||
|
||||
power += 200
|
||||
power += 200
|
||||
|
||||
//Some poor sod got eaten, go ahead and irradiate people nearby.
|
||||
for(var/mob/living/l in range(10))
|
||||
if(l in view())
|
||||
l.show_message("<span class=\"warning\">As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.</span>", 1,\
|
||||
"<span class=\"warning\">The unearthly ringing subsides and you notice you have new radiation burns.</span>", 2)
|
||||
else
|
||||
l.show_message("<span class=\"warning\">You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.</span>", 2)
|
||||
var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) )
|
||||
l.apply_effect(rads, IRRADIATE)
|
||||
for(var/mob/living/l in range(10))
|
||||
if(l in view())
|
||||
l.show_message("<span class=\"warning\">As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.</span>", 1,\
|
||||
"<span class=\"warning\">The unearthly ringing subsides and you notice you have new radiation burns.</span>", 2)
|
||||
else
|
||||
l.show_message("<span class=\"warning\">You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.</span>", 2)
|
||||
var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) )
|
||||
l.apply_effect(rads, IRRADIATE)
|
||||
|
||||
|
||||
+12
-13
@@ -438,28 +438,26 @@
|
||||
|
||||
client.screen -= hud_used.item_action_list
|
||||
|
||||
hud_used.item_action_list = list()
|
||||
for(var/obj/item/I in src)
|
||||
if(I.action_button_name)
|
||||
if(hud_used.item_action_list.len < num)
|
||||
var/obj/screen/item_action/N = new(hud_used)
|
||||
hud_used.item_action_list += N
|
||||
|
||||
var/obj/screen/item_action/A = hud_used.item_action_list[num]
|
||||
|
||||
if(I.icon_action_button)
|
||||
var/obj/screen/item_action/A = new(hud_used)
|
||||
|
||||
//A.icon = 'icons/mob/screen1_action.dmi'
|
||||
//A.icon_state = I.icon_action_button
|
||||
A.icon = ui_style2icon(client.prefs.UI_style)
|
||||
A.icon_state = "template"
|
||||
|
||||
A.overlays = list()
|
||||
var/image/img = image(I.icon, A, I.icon_state)
|
||||
img.pixel_x = 0
|
||||
img.pixel_y = 0
|
||||
A.overlays += img
|
||||
|
||||
A.name = I.action_button_name
|
||||
if(I.action_button_name)
|
||||
A.name = I.action_button_name
|
||||
else
|
||||
A.name = "Use [I.name]"
|
||||
A.owner = I
|
||||
|
||||
client.screen += hud_used.item_action_list[num]
|
||||
|
||||
hud_used.item_action_list += A
|
||||
switch(num)
|
||||
if(1)
|
||||
A.screen_loc = ui_action_slot1
|
||||
@@ -473,3 +471,4 @@
|
||||
A.screen_loc = ui_action_slot5
|
||||
break //5 slots available, so no more can be added.
|
||||
num++
|
||||
src.client.screen += src.hud_used.item_action_list
|
||||
|
||||
+75
-23
@@ -112,6 +112,7 @@ datum/mind
|
||||
out += "Factions and special roles:<br>"
|
||||
|
||||
var/list/sections = list(
|
||||
"implant",
|
||||
"revolution",
|
||||
"cult",
|
||||
"wizard",
|
||||
@@ -122,19 +123,26 @@ datum/mind
|
||||
"malfunction",
|
||||
)
|
||||
var/text = ""
|
||||
|
||||
var/mob/living/carbon/human/H = current
|
||||
if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey))
|
||||
/** Impanted**/
|
||||
if(istype(current, /mob/living/carbon/human))
|
||||
if(H.is_loyalty_implanted(H))
|
||||
text = "Loyalty Implant:<a href='?src=\ref[src];implant=remove'>Remove</a>|<b>Implanted</b></br>"
|
||||
else
|
||||
text = "Loyalty Implant:<b>No Implant</b>|<a href='?src=\ref[src];implant=add'>Implant him!</a></br>"
|
||||
else
|
||||
text = "Loyalty Implant: Don't implant that monkey!</br>"
|
||||
sections["implant"] = text
|
||||
/** REVOLUTION ***/
|
||||
text = "revolution"
|
||||
if (ticker.mode.config_tag=="revolution")
|
||||
text = uppertext(text)
|
||||
text += uppertext(text)
|
||||
text = "<i><b>[text]</b></i>: "
|
||||
if (assigned_role in command_positions)
|
||||
text += "<b>HEAD</b>|employee|headrev|rev"
|
||||
// else if (assigned_role in list("Security Officer", "Detective", "Warden"))
|
||||
// text += "head|<b>OFFICER</b>|employee|headre|rev"
|
||||
if (istype(current, /mob/living/carbon/monkey) || H.is_loyalty_implanted(H))
|
||||
text += "<b>LOYAL EMPLOYEE</b>|headrev|rev"
|
||||
else if (src in ticker.mode.head_revolutionaries)
|
||||
text = "head|<a href='?src=\ref[src];revolution=clear'>employee</a>|<b>HEADREV</b>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
|
||||
text = "<a href='?src=\ref[src];revolution=clear'>employee</a>|<b>HEADREV</b>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
|
||||
text += "<br>Flash: <a href='?src=\ref[src];revolution=flash'>give</a>"
|
||||
|
||||
var/list/L = current.get_contents()
|
||||
@@ -151,9 +159,9 @@ datum/mind
|
||||
if (objectives.len==0)
|
||||
text += "<br>Objectives are empty! <a href='?src=\ref[src];revolution=autoobjectives'>Set to kill all heads</a>."
|
||||
else if (src in ticker.mode.revolutionaries)
|
||||
text += "head|<a href='?src=\ref[src];revolution=clear'>employee</a>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<b>REV</b>"
|
||||
text += "<a href='?src=\ref[src];revolution=clear'>employee</a>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<b>REV</b>"
|
||||
else
|
||||
text += "head|<b>EMPLOYEE</b>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
|
||||
text += "<b>EMPLOYEE</b>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
|
||||
sections["revolution"] = text
|
||||
|
||||
/** CULT ***/
|
||||
@@ -161,19 +169,17 @@ datum/mind
|
||||
if (ticker.mode.config_tag=="cult")
|
||||
text = uppertext(text)
|
||||
text = "<i><b>[text]</b></i>: "
|
||||
if (assigned_role in command_positions)
|
||||
text += "<b>HEAD</b>|employee|cultist"
|
||||
// else if (assigned_role in list("Security Officer", "Detective", "Warden"))
|
||||
// text += "head|<b>OFFICER</b>|employee|cultist"
|
||||
if (istype(current, /mob/living/carbon/monkey) || H.is_loyalty_implanted(H))
|
||||
text += "<B>LOYAL EMPLOYEE</B>|cultist"
|
||||
else if (src in ticker.mode.cult)
|
||||
text += "head|<a href='?src=\ref[src];cult=clear'>employee</a>|<b>CULTIST</b>"
|
||||
text += "<a href='?src=\ref[src];cult=clear'>employee</a>|<b>CULTIST</b>"
|
||||
text += "<br>Give <a href='?src=\ref[src];cult=tome'>tome</a>|<a href='?src=\ref[src];cult=amulet'>amulet</a>."
|
||||
/*
|
||||
if (objectives.len==0)
|
||||
text += "<br>Objectives are empty! Set to sacrifice and <a href='?src=\ref[src];cult=escape'>escape</a> or <a href='?src=\ref[src];cult=summon'>summon</a>."
|
||||
*/
|
||||
else
|
||||
text += "head|<b>EMPLOYEE</b>|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
|
||||
text += "<b>EMPLOYEE</b>|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
|
||||
sections["cult"] = text
|
||||
|
||||
/** WIZARD ***/
|
||||
@@ -232,12 +238,16 @@ datum/mind
|
||||
if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan")
|
||||
text = uppertext(text)
|
||||
text = "<i><b>[text]</b></i>: "
|
||||
if (src in ticker.mode.traitors)
|
||||
text += "<b>TRAITOR</b>|<a href='?src=\ref[src];traitor=clear'>loyal</a>"
|
||||
if (objectives.len==0)
|
||||
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize</a>!"
|
||||
else
|
||||
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>LOYAL</b>"
|
||||
if(istype(current, /mob/living/carbon/human))
|
||||
if (H.is_loyalty_implanted(H))
|
||||
text +="traitor|<b>LOYAL EMPLOYEE</b>"
|
||||
else
|
||||
if (src in ticker.mode.traitors)
|
||||
text += "<b>TRAITOR</b>|<a href='?src=\ref[src];traitor=clear'>Employee</a>"
|
||||
if (objectives.len==0)
|
||||
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize</a>!"
|
||||
else
|
||||
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>Employee</b>"
|
||||
sections["traitor"] = text
|
||||
|
||||
/** MONKEY ***/
|
||||
@@ -485,6 +495,48 @@ datum/mind
|
||||
if(!istype(objective)) return
|
||||
objective.completed = !objective.completed
|
||||
|
||||
else if(href_list["implant"])
|
||||
var/mob/living/carbon/human/H = current
|
||||
switch(href_list["implant"])
|
||||
if("remove")
|
||||
for(var/obj/item/weapon/implant/loyalty/I in H.contents)
|
||||
for(var/datum/organ/external/organs in H.organs)
|
||||
if(I in organs.implants)
|
||||
I.Del()
|
||||
break
|
||||
H << "\blue <Font size =3><B>Your loyalty implant has been deactivated.</B></FONT>"
|
||||
if("add")
|
||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
|
||||
L.imp_in = H
|
||||
L.implanted = 1
|
||||
var/datum/organ/external/affected = H.organs_by_name["head"]
|
||||
affected.implants += L
|
||||
L.part = affected
|
||||
|
||||
H << "\red <Font size =3><B>You somehow have become the recepient of a loyalty transplant, and it just activated!</B></FONT>"
|
||||
if(src in ticker.mode.revolutionaries)
|
||||
special_role = null
|
||||
ticker.mode.revolutionaries -= src
|
||||
src << "\red <Font size = 3><B>The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!</B></Font>"
|
||||
if(src in ticker.mode.head_revolutionaries)
|
||||
special_role = null
|
||||
ticker.mode.head_revolutionaries -=src
|
||||
src << "\red <Font size = 3><B>The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!</B></Font>"
|
||||
if(src in ticker.mode.cult)
|
||||
ticker.mode.cult -= src
|
||||
ticker.mode.update_cult_icons_removed(src)
|
||||
special_role = null
|
||||
var/datum/game_mode/cult/cult = ticker.mode
|
||||
if (istype(cult))
|
||||
cult.memoize_cult_objectives(src)
|
||||
current << "\red <FONT size = 3><B>The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!</B></FONT>"
|
||||
memory = ""
|
||||
if(src in ticker.mode.traitors)
|
||||
ticker.mode.traitors -= src
|
||||
special_role = null
|
||||
current << "\red <FONT size = 3><B>The nanobots in the loyalty implant remove all thoughts about being a traitor to Nanotrasen. Have a nice day!</B></FONT>"
|
||||
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
|
||||
|
||||
else if (href_list["revolution"])
|
||||
switch(href_list["revolution"])
|
||||
if("clear")
|
||||
@@ -750,8 +802,8 @@ datum/mind
|
||||
special_role = "traitor"
|
||||
current << "<B>\red You are a traitor!</B>"
|
||||
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
|
||||
if(isAI(current))
|
||||
var/mob/living/silicon/ai/A = current
|
||||
if(istype(current, /mob/living/silicon))
|
||||
var/mob/living/silicon/A = current
|
||||
call(/datum/game_mode/proc/add_law_zero)(A)
|
||||
A.show_laws()
|
||||
|
||||
|
||||
@@ -958,19 +958,19 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
contains = list(/obj/machinery/power/supermatter)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/plasma
|
||||
containername = "Supermatter crate (CAUTIION)"
|
||||
access = access_ce
|
||||
containername = "Supermatter crate (CAUTION)"
|
||||
group = "Engineering"
|
||||
access = access_ce
|
||||
|
||||
|
||||
/datum/supply_packs/smsmall
|
||||
/* /datum/supply_packs/smsmall // Currently nonfunctional, waiting on virgil
|
||||
name = "Supermatter Shard"
|
||||
contains = list(/obj/machinery/power/supermatter/shard)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/plasma
|
||||
containername = "Supermatter crate (CAUTIION)"
|
||||
containername = "Supermatter shard crate (CAUTION)"
|
||||
access = access_ce
|
||||
group = "Engineering"
|
||||
group = "Engineering" */
|
||||
|
||||
/datum/supply_packs/shield_cap
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_cap)
|
||||
|
||||
@@ -780,6 +780,14 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Dormitories"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/crew_quarters/sleep/engi
|
||||
name = "\improper Engineering Dormitories"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/crew_quarters/sleep/sec
|
||||
name = "\improper Security Dormitories"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/crew_quarters/sleep_male
|
||||
name = "\improper Male Dorm"
|
||||
icon_state = "Sleep"
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
|
||||
continue
|
||||
S.last_charge = S.charge
|
||||
S.last_output = S.output
|
||||
S.last_online = S.online
|
||||
S.charge = 0
|
||||
S.output = 0
|
||||
S.online = 0
|
||||
@@ -60,9 +63,9 @@
|
||||
for(var/obj/machinery/power/smes/S in world)
|
||||
if(S.z != 1)
|
||||
continue
|
||||
S.charge = S.capacity
|
||||
S.output = 200000
|
||||
S.online = 1
|
||||
S.charge = S.last_charge
|
||||
S.output = S.last_output
|
||||
S.online = S.last_online
|
||||
S.updateicon()
|
||||
S.power_change()
|
||||
for(var/area/A in world)
|
||||
|
||||
@@ -85,8 +85,8 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief engineer"
|
||||
selection_color = "#fff5cc"
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
||||
minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
|
||||
minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -104,4 +104,4 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -95,7 +95,7 @@ obj/machinery/computer/general_air_control
|
||||
|
||||
process()
|
||||
..()
|
||||
src.updateDialog()
|
||||
src.updateUsrDialog()
|
||||
|
||||
attackby(I as obj, user as mob)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
@@ -250,7 +250,7 @@ Max Output Pressure: [output_pressure] kPa<BR>"}
|
||||
var/change = text2num(href_list["adj_pressure"])
|
||||
pressure_setting = between(0, pressure_setting + change, 50*ONE_ATMOSPHERE)
|
||||
spawn(1)
|
||||
src.updateDialog()
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
if(!radio_connection)
|
||||
@@ -282,7 +282,7 @@ Max Output Pressure: [output_pressure] kPa<BR>"}
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
|
||||
|
||||
spawn(5)
|
||||
src.updateDialog()
|
||||
src.updateUsrDialog()
|
||||
|
||||
fuel_injection
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
|
||||
@@ -454,6 +454,15 @@
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "wood_table"
|
||||
|
||||
/obj/structure/holostool
|
||||
name = "stool"
|
||||
desc = "Apply butt."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "stool"
|
||||
anchored = 1.0
|
||||
flags = FPRINT
|
||||
pressure_resistance = 15
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/boxing/hologlove
|
||||
name = "boxing gloves"
|
||||
|
||||
@@ -347,6 +347,7 @@ What a mess.*/
|
||||
P.info += "</TT>"
|
||||
P.name = "paper - 'Security Record'"
|
||||
printing = null
|
||||
updateUsrDialog()
|
||||
//RECORD DELETE
|
||||
if ("Delete All Records")
|
||||
temp = ""
|
||||
|
||||
@@ -199,6 +199,27 @@
|
||||
name = "agent card"
|
||||
access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
|
||||
origin_tech = "syndicate=3"
|
||||
var/registered_user=null
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/New(mob/user as mob)
|
||||
..()
|
||||
var/t = reject_bad_name(input(user, "What name would you like to put on this card?\nNode: You can change this later by clicking on the ID card while it's in your hand.", "Agent card name", ishuman(user) ? user.real_name : user.name))
|
||||
if(!t)
|
||||
alert("Invalid name.")
|
||||
if(!registered_name)
|
||||
registered_name = ishuman(user) ? user.real_name : user.name
|
||||
else
|
||||
registered_name = t
|
||||
var/u = copytext(sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")),1,MAX_MESSAGE_LEN)
|
||||
if(!u)
|
||||
alert("Invalid assignment.")
|
||||
assignment = "Assistant"
|
||||
else
|
||||
assignment = u
|
||||
name = "[registered_name]'s ID Card ([assignment])"
|
||||
user << "\blue You successfully forge the ID card."
|
||||
registered_user = user
|
||||
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
@@ -209,7 +230,6 @@
|
||||
if(user.mind.special_role)
|
||||
usr << "\blue The card's microscanners activate as you pass it over the ID, copying its access."
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/var/mob/registered_user = null
|
||||
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)
|
||||
if(!src.registered_name)
|
||||
//Stop giving the players unsanitized unputs! You are giving ways for players to intentionally crash clients! -Nodrak
|
||||
@@ -228,7 +248,10 @@
|
||||
src.name = "[src.registered_name]'s ID Card ([src.assignment])"
|
||||
user << "\blue You successfully forge the ID card."
|
||||
registered_user = user
|
||||
else if(registered_user == user)
|
||||
else if(!registered_user || registered_user == user)
|
||||
|
||||
if(!registered_user) registered_user = user // First one to pick it up is the owner if there is ever a wild case New() doens't work.
|
||||
|
||||
switch(alert("Would you like to display the ID, or retitle it?","Choose.","Rename","Show"))
|
||||
if("Rename")
|
||||
var t = copytext(sanitize(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)),1,26)
|
||||
|
||||
@@ -127,6 +127,7 @@ Implant Specifics:<BR>"}
|
||||
/obj/item/weapon/implant/explosive
|
||||
name = "explosive implant"
|
||||
desc = "A military grade micro bio-explosive. Highly dangerous."
|
||||
var/elevel = "Localized Limb"
|
||||
var/phrase = "supercalifragilisticexpialidocious"
|
||||
icon_state = "implant_evil"
|
||||
|
||||
@@ -157,20 +158,50 @@ Implant Specifics:<BR>"}
|
||||
activate()
|
||||
if (malfunction == MALFUNCTION_PERMANENT)
|
||||
return
|
||||
|
||||
var/need_gib = null
|
||||
if(istype(imp_in, /mob/))
|
||||
var/mob/T = imp_in
|
||||
|
||||
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
|
||||
log_game("Explosive implant triggered in [T] ([T.key]).")
|
||||
need_gib = 1
|
||||
|
||||
if(ishuman(imp_in))
|
||||
if (elevel == "Localized Limb")
|
||||
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
|
||||
imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!")
|
||||
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
||||
sleep(25)
|
||||
if (istype(part,/datum/organ/external/chest) || \
|
||||
istype(part,/datum/organ/external/groin) || \
|
||||
istype(part,/datum/organ/external/head))
|
||||
part.createwound(BRUISE, 60) //mangle them instead
|
||||
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
||||
del(src)
|
||||
else
|
||||
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
||||
part.droplimb(1)
|
||||
del(src)
|
||||
if (elevel == "Destroy Body")
|
||||
explosion(get_turf(T), -1, 0, 1, 6)
|
||||
T.gib()
|
||||
if (elevel == "Full Explosion")
|
||||
explosion(get_turf(T), 0, 1, 3, 6)
|
||||
T.gib()
|
||||
|
||||
T.gib()
|
||||
explosion(get_turf(imp_in), 1, 3, 4, 6, 3)
|
||||
else
|
||||
explosion(get_turf(imp_in), 0, 1, 3, 6)
|
||||
|
||||
if(need_gib)
|
||||
imp_in.gib()
|
||||
|
||||
var/turf/t = get_turf(imp_in)
|
||||
|
||||
if(t)
|
||||
t.hotspot_expose(3500,125)
|
||||
|
||||
implanted(mob/source as mob)
|
||||
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
|
||||
phrase = input("Choose activation phrase:") as text
|
||||
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
|
||||
phrase = sanitize_simple(phrase, replacechars)
|
||||
@@ -215,7 +246,7 @@ Implant Specifics:<BR>"}
|
||||
part.createwound(BRUISE, 60) //mangle them instead
|
||||
else
|
||||
part.droplimb(1)
|
||||
explosion(get_turf(imp_in), -1, -1, 2, 3, 3)
|
||||
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/implant/chem
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
"/obj/item/device/flashlight/pen",
|
||||
"/obj/item/clothing/mask/surgical",
|
||||
"/obj/item/clothing/gloves/latex",
|
||||
"/obj/item/weapon/reagent_containers/hypospray/autoinjector"
|
||||
"/obj/item/weapon/reagent_containers/hypospray"
|
||||
)
|
||||
|
||||
|
||||
@@ -166,4 +166,4 @@
|
||||
name = "inflatable duck"
|
||||
desc = "No bother to sink or swim when you can just float!"
|
||||
icon_state = "inflatable"
|
||||
item_state = "inflatable"
|
||||
item_state = "inflatable"
|
||||
|
||||
@@ -4,6 +4,18 @@
|
||||
density = 1
|
||||
layer = 2
|
||||
var/state = 0
|
||||
var/health = 200
|
||||
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj, /obj/item/projectile/beam))
|
||||
health -= Proj.damage
|
||||
..()
|
||||
if(health <= 0)
|
||||
new /obj/item/stack/sheet/metal(get_turf(src))
|
||||
del(src)
|
||||
|
||||
return
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench) && state == 0)
|
||||
@@ -183,10 +195,12 @@
|
||||
/obj/structure/girder/displaced
|
||||
icon_state = "displaced"
|
||||
anchored = 0
|
||||
health = 50
|
||||
|
||||
/obj/structure/girder/reinforced
|
||||
icon_state = "reinforced"
|
||||
state = 2
|
||||
health = 500
|
||||
|
||||
/obj/structure/cultgirder
|
||||
icon= 'icons/obj/cult.dmi'
|
||||
@@ -194,6 +208,7 @@
|
||||
anchored = 1
|
||||
density = 1
|
||||
layer = 2
|
||||
var/health = 250
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
@@ -220,6 +235,14 @@
|
||||
if(prob(40))
|
||||
del(src)
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj) //No beam check- How else will you destroy the cult girder with silver bullets?????
|
||||
health -= Proj.damage
|
||||
..()
|
||||
if(health <= 0)
|
||||
new /obj/item/stack/sheet/metal(get_turf(src))
|
||||
del(src)
|
||||
|
||||
return
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
handle_rotation()
|
||||
return
|
||||
else
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
|
||||
@@ -253,6 +253,7 @@
|
||||
'nano/templates/cryo.tmpl',
|
||||
'nano/templates/geoscanner.tmpl',
|
||||
'nano/templates/dna_modifier.tmpl',
|
||||
'nano/templates/telescience_console.tmpl',
|
||||
'nano/images/uiBackground.png',
|
||||
'nano/images/uiIcons16.png',
|
||||
'nano/images/uiIcons24.png',
|
||||
|
||||
@@ -296,6 +296,14 @@
|
||||
if(armor >= 2) return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
|
||||
for(var/L in M.contents)
|
||||
if(istype(L, /obj/item/weapon/implant/loyalty))
|
||||
for(var/datum/organ/external/O in M.organs)
|
||||
if(L in O.implants)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
@@ -1257,4 +1265,4 @@ mob/living/carbon/human/yank_out_object()
|
||||
if(species)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
|
||||
grabbed_by += G
|
||||
G.synch()
|
||||
|
||||
G.affecting = src
|
||||
LAssailant = M
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
@@ -298,6 +298,7 @@
|
||||
|
||||
grabbed_by += G
|
||||
G.synch()
|
||||
G.affecting = src
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
@@ -23,7 +23,10 @@
|
||||
var/online = 1
|
||||
var/n_tag = null
|
||||
var/obj/machinery/power/terminal/terminal = null
|
||||
|
||||
//Holders for powerout event.
|
||||
var/last_output = 0
|
||||
var/last_charge = 0
|
||||
var/last_online = 0
|
||||
|
||||
/obj/machinery/power/smes/New()
|
||||
..()
|
||||
|
||||
@@ -194,6 +194,11 @@
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
if(istype(in_chamber, /obj/item/projectile/beam/lastertag))
|
||||
user.show_message("<span class = 'warning'>You feel rather silly, trying to commit suicide with a toy.</span>")
|
||||
mouthshoot = 0
|
||||
return
|
||||
|
||||
in_chamber.on_hit(M)
|
||||
if (in_chamber.damage_type != HALLOSS)
|
||||
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]")
|
||||
|
||||
@@ -10,9 +10,11 @@
|
||||
icon_state = "dispenser"
|
||||
use_power = 0
|
||||
idle_power_usage = 40
|
||||
var/ui_name = "Chem Dispenser 5000"
|
||||
var/energy = 100
|
||||
var/max_energy = 100
|
||||
var/amount = 30
|
||||
var/amount = 30
|
||||
var/accept_glass = 0
|
||||
var/beaker = null
|
||||
var/recharged = 0
|
||||
var/hackedcheck = 0
|
||||
@@ -116,7 +118,7 @@
|
||||
data["energy"] = energy
|
||||
data["maxEnergy"] = max_energy
|
||||
data["isBeakerLoaded"] = beaker ? 1 : 0
|
||||
|
||||
data["glass"] = accept_glass
|
||||
var beakerContents[0]
|
||||
var beakerCurrentVolume = 0
|
||||
if(beaker && beaker:reagents && beaker:reagents.reagent_list.len)
|
||||
@@ -142,7 +144,7 @@
|
||||
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
// the ui does not exist, so we'll create a new one
|
||||
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 370, 605)
|
||||
ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_name, 370, 605)
|
||||
// When the UI is first opened this is the data it will use
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
@@ -164,7 +166,7 @@
|
||||
|
||||
if(href_list["dispense"])
|
||||
if (dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
|
||||
var/obj/item/weapon/reagent_containers/glass/B = src.beaker
|
||||
var/obj/item/weapon/reagent_containers/B = src.beaker
|
||||
var/datum/reagents/R = B.reagents
|
||||
var/space = R.maximum_volume - R.total_volume
|
||||
|
||||
@@ -173,14 +175,14 @@
|
||||
|
||||
if(href_list["ejectBeaker"])
|
||||
if(beaker)
|
||||
var/obj/item/weapon/reagent_containers/glass/B = beaker
|
||||
var/obj/item/weapon/reagent_containers/B = beaker
|
||||
B.loc = loc
|
||||
beaker = null
|
||||
|
||||
add_fingerprint(usr)
|
||||
return 1 // update UIs attached to this object
|
||||
|
||||
/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
|
||||
/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/reagent_containers/B as obj, var/mob/user as mob)
|
||||
if(isrobot(user))
|
||||
return
|
||||
|
||||
@@ -197,7 +199,9 @@
|
||||
if(src.beaker)
|
||||
user << "Something is already loaded into the machine."
|
||||
return
|
||||
if(istype(B, /obj/item/weapon/reagent_containers/glass||/obj/item/weapon/reagent_containers/food))
|
||||
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food))
|
||||
if(!accept_glass && istype(B,/obj/item/weapon/reagent_containers/food))
|
||||
user << "<span class='notice'>This machine only accepts beakers</span>"
|
||||
src.beaker = B
|
||||
user.drop_item()
|
||||
B.loc = src
|
||||
@@ -221,9 +225,11 @@
|
||||
icon_state = "soda_dispenser"
|
||||
name = "soda fountain"
|
||||
desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch."
|
||||
ui_name = "Soda Dispens-o-matic"
|
||||
energy = 100
|
||||
accept_glass = 1
|
||||
max_energy = 100
|
||||
dispensable_reagents = list("water","ice","coffee","tea","icetea","space_cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice")
|
||||
dispensable_reagents = list("water","ice","coffee","cream","tea","icetea","cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice","watermelonjuice")
|
||||
|
||||
/obj/machinery/chem_dispenser/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
|
||||
..()
|
||||
@@ -242,13 +248,16 @@
|
||||
/obj/machinery/chem_dispenser/beer
|
||||
icon_state = "booze_dispenser"
|
||||
name = "booze dispenser"
|
||||
ui_name = "Booze Portal 9001"
|
||||
energy = 100
|
||||
accept_glass = 1
|
||||
max_energy = 100
|
||||
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
|
||||
dispensable_reagents = list("water","ice","coffee","tea","cream","lemon_lime","sugar","orangejuice","limejuice","cola","sodawater","tonic","beer","kahlua","whiskey","wine","vodka","gin","rum","tequila","vermouth","cognac","ale","mead")
|
||||
dispensable_reagents = list("lemon_lime","sugar","orangejuice","limejuice","sodawater","tonic","beer","kahlua","whiskey","wine","vodka","gin","rum","tequilla","vermouth","cognac","ale","mead")
|
||||
|
||||
/obj/machinery/chem_dispenser/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
|
||||
..()
|
||||
|
||||
if(istype(B, /obj/item/device/multitool))
|
||||
if(hackedcheck == 0)
|
||||
user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
|
||||
@@ -281,6 +290,7 @@
|
||||
var/bottlesprite = "1" //yes, strings
|
||||
var/pillsprite = "1"
|
||||
var/client/has_sprites = list()
|
||||
var/max_pill_count = 20
|
||||
|
||||
/obj/machinery/chem_master/New()
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
@@ -424,12 +434,26 @@
|
||||
reagents.clear_reagents()
|
||||
icon_state = "mixer0"
|
||||
else if (href_list["createpill"] || href_list["createpill_multiple"])
|
||||
var/name = reject_bad_text(input(usr,"Name:","Name your pill!",reagents.get_master_reagent_name()))
|
||||
|
||||
var/count = 1
|
||||
if (href_list["createpill_multiple"]) count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num)
|
||||
if (count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines?
|
||||
|
||||
if(reagents.total_volume/count < 1) //Sanity checking.
|
||||
return
|
||||
|
||||
if (href_list["createpill_multiple"])
|
||||
count = Clamp(isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num),1,max_pill_count)
|
||||
|
||||
if(reagents.total_volume/count < 1) //Sanity checking.
|
||||
return
|
||||
|
||||
var/amount_per_pill = reagents.total_volume/count
|
||||
if (amount_per_pill > 50) amount_per_pill = 50
|
||||
|
||||
var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)"))
|
||||
|
||||
if(reagents.total_volume/count < 1) //Sanity checking.
|
||||
return
|
||||
|
||||
while (count--)
|
||||
var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc)
|
||||
if(!name) name = reagents.get_master_reagent_name()
|
||||
@@ -442,6 +466,7 @@
|
||||
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
|
||||
P.loc = loaded_pill_bottle
|
||||
src.updateUsrDialog()
|
||||
|
||||
else if (href_list["createbottle"])
|
||||
if(!condi)
|
||||
var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()))
|
||||
|
||||
@@ -2626,7 +2626,7 @@ datum
|
||||
color = "#619494" // rgb: 97, 148, 148
|
||||
|
||||
drink/cold/space_cola
|
||||
name = "Cola"
|
||||
name = "Space Cola"
|
||||
id = "cola"
|
||||
description = "A refreshing beverage."
|
||||
reagent_state = LIQUID
|
||||
@@ -2649,7 +2649,7 @@ datum
|
||||
return
|
||||
|
||||
drink/cold/spacemountainwind
|
||||
name = "Space Mountain Wind"
|
||||
name = "Mountain Wind"
|
||||
id = "spacemountainwind"
|
||||
description = "Blows right through you like a space wind."
|
||||
color = "#102000" // rgb: 16, 32, 0
|
||||
@@ -2907,8 +2907,8 @@ datum
|
||||
if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy)
|
||||
if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy)
|
||||
|
||||
if(!src.data) data = 1
|
||||
src.data += boozepwr
|
||||
if(!src.data || (!isnum(src.data) && src.data.len)) data = 1 //if it doesn't exist we set it. if it's a list we're going to set it to 1 as well. This is to
|
||||
src.data += boozepwr //avoid a runtime error associated with drinking blood mixed in drinks (demon's blood).
|
||||
|
||||
var/d = data
|
||||
|
||||
@@ -3456,7 +3456,6 @@ datum
|
||||
description = "AHHHH!!!!"
|
||||
color = "#820000" // rgb: 130, 0, 0
|
||||
boozepwr = 3
|
||||
|
||||
ethanol/vodkatonic
|
||||
name = "Vodka and Tonic"
|
||||
id = "vodkatonic"
|
||||
|
||||
@@ -16,6 +16,12 @@ var/list/GPS_list = list()
|
||||
GPS_list.Add(src)
|
||||
name = "global positioning system ([gpstag])"
|
||||
overlays += "working"
|
||||
/obj/item/device/gps/Del()
|
||||
GPS_list.Remove(src)
|
||||
..()
|
||||
/obj/item/device/gps/Del()
|
||||
GPS_list.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/device/gps/Del()
|
||||
GPS_list.Remove(src)
|
||||
|
||||
+1042
-1007
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 139 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 137 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 111 KiB |
+580
-548
File diff suppressed because it is too large
Load Diff
+8
-1
@@ -176,6 +176,8 @@ h4 {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
|
||||
div.notice {
|
||||
clear: both;
|
||||
}
|
||||
@@ -304,6 +306,11 @@ div.notice {
|
||||
width: 110px;
|
||||
float: left;
|
||||
}
|
||||
.fixedLeftWide {
|
||||
width: 150px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.floatRight {
|
||||
float: right;
|
||||
}
|
||||
@@ -355,4 +362,4 @@ div.notice {
|
||||
height: 200px;
|
||||
margin: 200px 0;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,23 +26,32 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
|
||||
<div class="item"> </div>
|
||||
<div class="item">
|
||||
<div class="itemLabel" style="width: 100%;">
|
||||
Chemical Dispenser
|
||||
{^{if glass}}
|
||||
Drink Dispenser
|
||||
{{else}}
|
||||
Chemical Dispenser
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
<div class="itemContentWide" style="width: 100%;">
|
||||
{^{for chemicals}}
|
||||
{^{:~link(title, 'circle-arrow-s', commands, null, 'fixedLeft')}}
|
||||
{^{:~link(title, 'circle-arrow-s', commands, null, ~root.glass ? 'fixedLeftWide' : 'fixedLeft' )}}
|
||||
{{/for}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="item"> </div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Beaker Contents
|
||||
{^{if glass}}
|
||||
Glass
|
||||
{{else}}
|
||||
Beaker
|
||||
{{/if}} Contents
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{^{:~link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, isBeakerLoaded ? null : 'disabled', 'floatRight')}}
|
||||
{^{:~link(glass ? 'Eject Glass' : 'Eject Beaker', 'eject', {'ejectBeaker' : 1}, isBeakerLoaded ? null : 'disabled', 'floatRight')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="statusDisplay" style="height: 225px; overflow: auto;">
|
||||
@@ -53,11 +62,22 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
|
||||
{^{for beakerContents}}
|
||||
<span class="highlight">{^{:volume}} units of {^{:name}}</span><br>
|
||||
{{else}}
|
||||
<span class="bad">Beaker is empty</span>
|
||||
<span class="bad">
|
||||
{^{if glass}}
|
||||
Glass
|
||||
{{else}}
|
||||
Beaker
|
||||
{{/if}}
|
||||
is empty</span>
|
||||
{{/for}}
|
||||
{{else}}
|
||||
<span class="average"><i>No beaker loaded</i></span>
|
||||
<span class="average"><i>No
|
||||
{^{if glass}}
|
||||
Glass
|
||||
{{else}}
|
||||
Beaker
|
||||
{{/if}} loaded</i></span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<!--
|
||||
Title: Telescience Control UI
|
||||
Used In File(s): \code\modules\telesci\telesci_computer.dm
|
||||
-->
|
||||
<div class="item">
|
||||
<div class="itemLabel">Coordinates:</div>
|
||||
<div class="itemContent">
|
||||
{^{:~link('X: ' + coordx, 'gear', {'setx': 1})}}
|
||||
{^{:~link('Y: ' + coordy, 'gear', {'sety': 1})}}
|
||||
{^{:~link('Z: ' + coordz, 'gear', {'setz': 1})}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">Controls:</div>
|
||||
<div class="itemContent">
|
||||
{^{:~link('Send', 'gear', {'send': 1}, null, (coordx != null && coordy != null && coordz != null) ? '' : 'disabled')}}
|
||||
{^{:~link('Receive', 'gear', {'receive': 1}, null, (coordx != null && coordy != null && coordz != null) ? '' : 'disabled')}}
|
||||
{^{:~link('Recalibrate', 'gear', {'recal': 1})}}
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user