diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/areas.dm b/code/WorkInProgress/Cael_Aislinn/Rust/areas.dm index 6183ed04f6..f3a9a4ea1c 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/areas.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/areas.dm @@ -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 diff --git a/code/WorkInProgress/Yinadele/Supermatter.dm b/code/WorkInProgress/Yinadele/Supermatter.dm index b9af01b938..39759ff494 100644 --- a/code/WorkInProgress/Yinadele/Supermatter.dm +++ b/code/WorkInProgress/Yinadele/Supermatter.dm @@ -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("\The [user] reaches out and touches \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ - "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.\"",\ - "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") + user.visible_message("\The [user] reaches out and touches \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ + "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.\"",\ + "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") - 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("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\ - "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ - "Everything suddenly goes silent.") + user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\ + "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ + "Everything suddenly goes silent.") - 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("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ - "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ - "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") - else - AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\ - "You hear a loud crack as you are washed with a wave of heat.") + if(istype(AM, /mob/living)) + AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ + "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ + "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") + else + AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\ + "You hear a loud crack as you are washed with a wave of heat.") - 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("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ - "The unearthly ringing subsides and you notice you have new radiation burns.", 2) - else - l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 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("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ + "The unearthly ringing subsides and you notice you have new radiation burns.", 2) + else + l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) + var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) ) + l.apply_effect(rads, IRRADIATE) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 32e9e1046e..3d97018352 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -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 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 82a26dab65..511731195e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -241,13 +241,13 @@ datum/mind if(istype(current, /mob/living/carbon/human)) if (H.is_loyalty_implanted(H)) text +="traitor|LOYAL EMPLOYEE" - else - if (src in ticker.mode.traitors) - text += "TRAITOR|Employee" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" else - text += "traitor|Employee" + if (src in ticker.mode.traitors) + text += "TRAITOR|Employee" + if (objectives.len==0) + text += "
Objectives are empty! Randomize!" + else + text += "traitor|Employee" sections["traitor"] = text /** MONKEY ***/ diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 664b065d1c..9b1ccf64b0 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -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) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 9ff5a6e0cd..9c04d5b672 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -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" diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index faac347b33..81074ca235 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -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
"} 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
"} radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) spawn(5) - src.updateDialog() + src.updateUsrDialog() fuel_injection icon = 'icons/obj/computer.dmi' diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 0252f69765..f9d765de6a 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -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" diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e56ba78f20..479633ff10 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -347,6 +347,7 @@ What a mess.*/ P.info += "" P.name = "paper - 'Security Record'" printing = null + updateUsrDialog() //RECORD DELETE if ("Delete All Records") temp = "" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 2ca53be3ee..12db8fc376 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -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) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 20148aab7b..bcc337ec57 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -127,6 +127,7 @@ Implant Specifics:
"} /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" @@ -161,22 +162,46 @@ Implant Specifics:
"} var/need_gib = null if(istype(imp_in, /mob/)) var/mob/T = imp_in - message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") 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() - 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) @@ -221,7 +246,7 @@ Implant Specifics:
"} 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 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index cd8b5420c1..036c57b003 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -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" \ No newline at end of file + item_state = "inflatable" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index b50225838e..286c28f37e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -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) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 2abfe0f4fc..95c5d63840 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -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', diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index aad87026b2..f192e080c0 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -17,6 +17,7 @@ //If you died in the game and are a ghsot - this will remain as null. //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. var/has_enabled_antagHUD = 0 + var/medHUD = 0 var/antagHUD = 0 universal_speak = 1 var/atom/movable/following = null @@ -107,7 +108,61 @@ Works together with spawning an observer, noted above. target_list += target if(target_list.len) assess_targets(target_list, src) + if(medHUD) + process_medHUD(src) + +// Direct copied from medical HUD glasses proc, used to determine what health bar to put over the targets head. +/mob/dead/proc/RoundHealth(var/health) + switch(health) + if(100 to INFINITY) + return "health100" + if(70 to 100) + return "health80" + if(50 to 70) + return "health60" + if(30 to 50) + return "health40" + if(18 to 30) + return "health25" + if(5 to 18) + return "health10" + if(1 to 5) + return "health1" + if(-99 to 0) + return "health0" + else + return "health-100" + return "0" + + +// Pretty much a direct copy of Medical HUD stuff, except will show ill if they are ill instead of also checking for known illnesses. + +/mob/dead/proc/process_medHUD(var/mob/M) + var/client/C = M.client + var/image/holder + for(var/mob/living/carbon/human/patient in oview(M)) + var/foundVirus = 0 + if(patient.virus2.len) + foundVirus = 1 + if(!C) return + holder = patient.hud_list[HEALTH_HUD] + if(patient.stat == 2) + holder.icon_state = "hudhealth-100" + else + holder.icon_state = "hud[RoundHealth(patient.health)]" + C.images += holder + + holder = patient.hud_list[STATUS_HUD] + if(patient.stat == 2) + holder.icon_state = "huddead" + else if(patient.status_flags & XENO_HOST) + holder.icon_state = "hudxeno" + else if(foundVirus) + holder.icon_state = "hudill" + else + holder.icon_state = "hudhealthy" + C.images += holder /mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) @@ -238,6 +293,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp mind.current.key = key return 1 +/mob/dead/observer/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + if(!client) + return + if(medHUD) + medHUD = 0 + src << "\blue Medical HUD Disabled" + else + medHUD = 1 + src << "\blue Medical HUD Enabled" + /mob/dead/observer/verb/toggle_antagHUD() set category = "Ghost" set name = "Toggle AntagHUD" diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 4c96749e87..3bd5348318 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -793,8 +793,6 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) base = icon('icons/mob/human_races/r_human.dmi') if(base) - base = base.MakeLying() - //Changing limb's skin tone to match owner if(!H.species || H.species.flags & HAS_SKIN_TONE) if (H.s_tone >= 0) @@ -802,28 +800,9 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) else base.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT) - //this is put here since I can't easially edit the same icon from head's constructor - if(istype(src, /obj/item/weapon/organ/head)) - //Add (facial) hair. - if(H.f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] - if(facial_hair_style) - var/icon/facial = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l") - if(facial_hair_style.do_colouration) - facial.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) - - base.Blend(facial, ICON_OVERLAY) - - if(H.h_style && !(H.head && (H.head.flags & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style] - if(hair_style) - var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l") - if(hair_style.do_colouration) - hair.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) - - base.Blend(hair, ICON_OVERLAY) - icon = base + dir = SOUTH + src.transform = turn(src.transform, rand(70,130)) /**************************************************** @@ -864,6 +843,24 @@ obj/item/weapon/organ/head/New(loc, mob/living/carbon/human/H) if(istype(H)) src.icon_state = H.gender == MALE? "head_m" : "head_f" ..() + //Add (facial) hair. + if(H.f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] + if(facial_hair_style) + var/icon/facial = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) + + overlays.Add(facial) // icon.Blend(facial, ICON_OVERLAY) + + if(H.h_style && !(H.head && (H.head.flags & BLOCKHEADHAIR))) + var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style] + if(hair_style) + var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + hair.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) + + overlays.Add(hair) //icon.Blend(hair, ICON_OVERLAY) spawn(5) if(brainmob && brainmob.client) brainmob.client.screen.len = null //clear the hud diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 421915813f..8a46fcb356 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -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 << "This machine only accepts beakers" 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." @@ -441,7 +450,6 @@ 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() diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 07203d0ac4..ffefd49fc9 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -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 diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 3850d439d2..b4fa7704a3 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -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) diff --git a/html/changelog.html b/html/changelog.html index 53a22bcdf8..262402edd7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -73,7 +73,27 @@ should be listed in the changelog upon commit though. Thanks. -->
- +
+

24 November 2013

+

Yinadele updated:

+ +

29 October 2013

Cael_Aislinn updated:

\ No newline at end of file + diff --git a/nano/templates/telescience_console.tmpl b/nano/templates/telescience_console.tmpl new file mode 100644 index 0000000000..ae92ed3e13 --- /dev/null +++ b/nano/templates/telescience_console.tmpl @@ -0,0 +1,20 @@ + +
+
Coordinates:
+
+ {^{:~link('X: ' + coordx, 'gear', {'setx': 1})}} + {^{:~link('Y: ' + coordy, 'gear', {'sety': 1})}} + {^{:~link('Z: ' + coordz, 'gear', {'setz': 1})}} +
+
+
+
Controls:
+
+ {^{:~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})}} +
+