diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index b6e16181868..c5eba6e8092 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -287,7 +287,7 @@ spawn(0) temp_glassairlock.prison_open() for (var/obj/machinery/door_timer/temp_timer in A) - temp_timer.releasetime = 1 + temp_timer.timeleft = 0 sleep(150) command_alert(/datum/command_alert/graytide) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index a86ef490b9b..9acde08226f 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -14,16 +14,25 @@ icon_state = "frame" desc = "A remote control for a door." req_access = list(access_brig) - anchored = 1.0 // can't pick it up - density = 0 // can walk through it. - var/id_tag = null // id of door it controls. - var/releasetime = 0 // when world.timeofday reaches it - release the prisoneer - var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing + anchored = TRUE + density = FALSE + var/id_tag = null // id of door it controls + var/timeleft = 0 // in seconds + var/timing = FALSE var/picture_state // icon_state of alert picture, if not displaying text/numbers var/list/obj/machinery/targets = list() var/last_call = 0 layer = ABOVE_WINDOW_LAYER +/obj/machinery/door_timer/New() + ..() + machines -= src + fast_objects += src //process every 0.5 instead of every 2 + +/obj/machinery/door_timer/Destroy() + fast_objects -= src + ..() + /obj/machinery/door_timer/initialize() ..() @@ -33,6 +42,7 @@ for(var/obj/machinery/door/window/brigdoor/M in all_doors) if (M.id_tag == src.id_tag) targets += M + M.open() //these start the shift open for(var/obj/machinery/flasher/F in flashers) if(F.id_tag == src.id_tag) @@ -50,16 +60,15 @@ // if it's less than 0, open door, reset timer // update the door_timer window and the icon /obj/machinery/door_timer/process() - if(stat & (NOPOWER|BROKEN)) + if((stat & (NOPOWER|BROKEN)) || !timing) return - if(src.timing) - if(timeleft() == 0) - src.timer_end() // open doors, reset timer, clear status screen - src.timing = 0 - src.updateUsrDialog() - src.update_icon() - else - timer_end() + if(timeleft <= 0) + timer_end() // open doors, reset timer, clear status screen + timing = FALSE + return + timeleft -= (SS_WAIT_FAST_OBJECTS/(1 SECONDS)) //this is a fast object + updateUsrDialog() + update_icon() // has the door power sitatuation changed, if so update icon. @@ -107,36 +116,28 @@ C.locked = 0 C.icon_state = C.icon_closed + timeleft = 0 + + update_icon() + return 1 -/obj/machinery/door_timer/proc/timeleft() - if(timing) - . = max((releasetime-world.timeofday)/10, 0) - else - . = max((releasetime-last_call)/10, 0) - - if(. < 0) . = 0 - last_call = world.timeofday - /obj/machinery/door_timer/proc/timeset(var/seconds) - releasetime=world.timeofday+seconds*10 - last_call = world.timeofday + timeleft = seconds //Allows AIs to use door_timer, see human attack_hand function below /obj/machinery/door_timer/attack_ai(var/mob/user as mob) - src.add_hiddenprint(user) - return src.attack_hand(user) + add_hiddenprint(user) + return attack_hand(user) //Allows humans to use door_timer //Opens dialog window when someone clicks on door timer // Allows altering timer and the timing boolean. -// Flasher activation limited to 150 seconds +// Flasher activation limited to 15 seconds /obj/machinery/door_timer/attack_hand(var/mob/user as mob) if(..()) return - var/second = round(timeleft() % 60) - var/minute = round((timeleft() - second) / 60) user.set_machine(src) var/dat = "" @@ -148,10 +149,10 @@ dat += "Activate Timer and close door
" - dat += {"Time Left: [(minute ? text("[minute]:") : null)][second]
+ dat += {"Time Left: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
- - + +
"} for(var/obj/machinery/flasher/F in targets) - if(F.last_flash && (F.last_flash + 150) > world.timeofday) + if(F.last_flash && (F.last_flash + 15 SECONDS) > world.timeofday) dat += "
Flash Charging" else dat += "
Activate Flash" @@ -177,26 +178,21 @@ usr.set_machine(src) if(href_list["timing"]) - src.timing = text2num(href_list["timing"]) + timing = text2num(href_list["timing"]) else - if(href_list["tp"]) //adjust timer, close door if not already closed - var/tp = text2num(href_list["tp"]) - var/timeleft = timeleft() - timeleft += tp - timeleft = min(max(round(timeleft), 0), 3600) - timeset(timeleft) - //src.timing = 1 - //src.closedoor() + if(href_list["tp"]) + timeleft += text2num(href_list["tp"]) + timeleft = clamp(round(timeleft), 0, 1 HOURS) if(href_list["fc"]) for(var/obj/machinery/flasher/F in targets) F.flash() - src.add_fingerprint(usr) - src.updateUsrDialog() - src.update_icon() - if(src.timing) - src.timer_start() + add_fingerprint(usr) + updateUsrDialog() + update_icon() + if(timing) + timer_start() else - src.timer_end() + timer_end() //icon update function @@ -210,9 +206,8 @@ if(stat & (BROKEN)) set_picture("ai_bsod") return - if(src.timing) + if(timing) var/disp1 = uppertext(id_tag) - var/timeleft = timeleft() var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]" spawn(0.5 SECONDS) update_display(disp1, disp2) @@ -303,10 +298,7 @@ /obj/machinery/door_timer/npc_tamper_act(mob/living/L) //Increase or decrease the release time by a random number - var/timeleft = timeleft() - timeleft = max(0, timeleft + rand(-60, 60)) //From -1 minute to 1 minute. Can't go below 0 - timeset(timeleft) timer_start() if(prob(10)) //Flash the flashers diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 22e9e0ae29c..19feeebed2a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1326,6 +1326,9 @@ var/global/list/image/blood_overlays = list() user.drop_from_inventory(cuffs) C.equip_to_slot(cuffs, slot_handcuffed) cuffs.on_restraint_apply(C) + var/list/findcuffs = get_contents_in_object(user,/obj/item/device/law_planner) + for(var/obj/item/device/law_planner/LP in findcuffs) + LP.handcuff_signal() return TRUE /obj/item/proc/on_restraint_removal(var/mob/living/carbon/C) //Needed for syndicuffs diff --git a/code/game/objects/items/sec_lawplanner.dm b/code/game/objects/items/sec_lawplanner.dm new file mode 100644 index 00000000000..9458d4f92ce --- /dev/null +++ b/code/game/objects/items/sec_lawplanner.dm @@ -0,0 +1,384 @@ +#define LAW_ASSAULT 1 +#define LAW_DAMAGE 2 +#define LAW_THEFT 3 +#define LAW_CONTRABAND 4 +#define LAW_TRESPASS 5 +#define LAW_ESCAPE 6 +#define LAW_INSUB 7 + +/obj/item/device/law_planner + name = "law planning frame" + desc = "A large data pad with buttons for crimes. Used for planning a brig sentence." + w_class = W_CLASS_SMALL + origin_tech = Tc_PROGRAMMING + "=6" + icon = 'icons/obj/device.dmi' + icon_state = "lawplanner" + item_state = "electronic" + req_access = list(access_brig) + var/announce = 1 //If true, read crimes when you hit the cell timer + var/start_timer = FALSE //If true, automatically start the timer on upload + var/time_arrest = FALSE //If true, start counting time when the arrest is made, to subtract from the sentence. + var/timing = 0 //Time of arrest. + var/datum/data/record/upload_crimes = null //Will look for an associated datacore file and upload crimes + var/list/rapsheet = list() + var/total_time = 0 + +/obj/item/device/law_planner/attack_self(mob/user) + ui_interact(user) + +/obj/item/device/law_planner/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open=NANOUI_FOCUS) + if(user.stat && !isAdminGhost(user)) + return + + // this is the data which will be sent to the ui + var/list/data = list() + data["timer"] = total_time + data["announce"] = announce + data["starttimer"] = start_timer + data["timearrest"] = time_arrest + data["arresttime"] = worldtime2text(timing) + if(upload_crimes) + data["perp"] = upload_crimes.fields["name"] + data["crimes"] = english_list(rapsheet) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "lawplanner.tmpl", "Law Planning Frame", 520, 500) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/item/device/law_planner/Topic(href, href_list) + if(..(href, href_list)) + return + + var/datum/law/L + if(href_list["assault"]) + L = findlaw(LAW_ASSAULT,text2num(href_list["assault"])) + else if(href_list["damage"]) + L = findlaw(LAW_DAMAGE,text2num(href_list["damage"])) + else if(href_list["theft"]) + L = findlaw(LAW_THEFT,text2num(href_list["theft"])) + else if(href_list["contraband"]) + L = findlaw(LAW_CONTRABAND,text2num(href_list["contraband"])) + else if(href_list["trespass"]) + L = findlaw(LAW_TRESPASS,text2num(href_list["trespass"])) + else if(href_list["escape"]) + L = findlaw(LAW_ESCAPE,text2num(href_list["escape"])) + else if(href_list["insubordination"]) + L = findlaw(LAW_INSUB,text2num(href_list["insubordination"])) + + switch(href_list["toggle"]) + if("announce") + announce = !announce + if("starttimer") + start_timer = !start_timer + if("timearrest") + time_arrest = !time_arrest + + switch(href_list["clear"]) + if("record") + upload_crimes = null + if("rapsheet") + rapsheet.Cut() + total_time = 0 + if("arresttime") + timing = 0 + + if(!L) + updateUsrDialog() + return 1 + rapsheet += initial(L.name) + total_time += initial(L.penalty) + if(initial(L.death)) + visible_message("[bicon(src)] \The [src] beeps, \"This inmate is eligible for execution.\"") + + if(initial(L.demotion)) + visible_message("[bicon(src)] \The [src] beeps, \"This inmate is eligible for demotion.\"") + updateUsrDialog() + return 1 + + +/obj/item/device/law_planner/proc/announce() + visible_message("[bicon(src)] \The [src] beeps, \"Charges: [english_list(rapsheet)]") + visible_message("[bicon(src)] \The [src] beeps, \"[total_time] minutes.") + +/obj/item/device/law_planner/preattack(var/atom/A, var/mob/user, var/proximity_flag) + if(!proximity_flag) + return 1 + if(!allowed(user)) + to_chat(user, "You must wear your ID!") + return 1 + if(ishuman(A)&&!(A==user)) + var/mob/living/carbon/human/H = A + var/identity = H.get_face_name() + if(identity == "Unknown") + visible_message("[bicon(src)] \The [src] beeps, \"Error. Subject's face was not readable.\"") + return 1 + for(var/datum/data/record/E in data_core.security) + if(E.fields["name"] == A.name) + visible_message("[bicon(src)] \The [src] beeps, \"Verified. Found record match for [A].") + upload_crimes = E + timing = 0 + return 1 + visible_message("[bicon(src)] \The [src] beeps, \"Error. No security record found.\"") + return 1 + if(istype(A,/obj/machinery/computer/secure_data)) + if(upload_crimes) + upload_crimes(user) + rapsheet.Cut() + total_time = 0 + return 1 + if(istype(A,/obj/machinery/door_timer)) + if(!rapsheet.len) + visible_message("[bicon(src)] \The [src] beeps, \"Error. Zero charges have been issued.\"") + if(announce) + announce() + if(upload_crimes) + upload_crimes(user) + var/apply = (total_time MINUTES) / (1 SECONDS) + if(timing) + visible_message("[bicon(src)] \The [src] beeps, \"Deducting [round((world.time - timing)/(1 SECONDS))] seconds on time served.\"") + apply -= round((world.time - timing)/(1 SECONDS)) + timing = 0 + var/obj/machinery/door_timer/D = A + D.timeleft += apply + if(start_timer && !D.timing) + D.timing = TRUE + D.timer_start() + rapsheet.Cut() + total_time = 0 + return 1 + + else + return ..() + +/obj/item/device/law_planner/proc/upload_crimes(mob/user) + upload_crimes.fields["criminal"] = "Incarcerated" + var/counter = 1 + while(upload_crimes.fields["com_[counter]"]) + counter++ + upload_crimes.fields["com_[counter]"] = "Made by [user] (Automated) at [worldtime2text()] [time_arrest? "(Arrested [worldtime2text(timing)])":""]
[english_list(rapsheet)]" + upload_crimes = null + +//received signal from handcuffs +/obj/item/device/law_planner/proc/handcuff_signal() + if(time_arrest) + if(timing) + visible_message("[bicon(src)] \The [src] beeps, \"An arrest timer is already running.\"") + else + timing = world.time + updateUsrDialog() + +/*********************************************************************** +*** SPACE LAW DATUMS *** +***********************************************************************/ + +#define LAW_A1 1 +#define LAW_A2 2 +#define LAW_B1 3 +#define LAW_B2 4 +#define LAW_C1 5 +#define LAW_C2 6 + +/proc/findlaw(var/mother,var/code) + var/list/possible_laws = subtypesof(/datum/law) + for(var/possible in possible_laws) + var/datum/law/L = possible + if((initial(L.mothercrime) == mother) && (initial(L.code) == code)) + return L + //otherwise, returns null + +/datum/law + var/name = "law" + var/mothercrime = 0 + var/penalty = 0 + var/death = FALSE + var/demotion = FALSE + var/code = 0 + +/datum/law/assault + mothercrime = LAW_ASSAULT + +/datum/law/assault/minor + name = "1A-1 MINOR ASSAULT" + penalty = 3 + code = LAW_A1 + +/datum/law/assault/full + name = "1A-2 ASSAULT" + penalty = 6 + code = LAW_A2 + +/datum/law/assault/abduction + name = "1B-1 ABDUCTION" + penalty = 10 + code = LAW_B1 + +/datum/law/assault/manslaughter + name = "1C-1 MANSLAUGHTER" + penalty = 10 + code = LAW_C1 + +/datum/law/assault/murder + name = "1C-2 MURDER" + penalty = 10 + death = TRUE + code = LAW_C2 + +/datum/law/damage + mothercrime = LAW_DAMAGE + +/datum/law/damage/vandalism + name = "2A-1 VANDALISM" + penalty = 3 + code = LAW_A1 + +/datum/law/damage/negligence + name = "2B-1 NEGLIGENCE" + penalty = 5 + code = LAW_B1 + demotion = TRUE + +/datum/law/damage/sabotage + name = "2B-2 SABOTAGE" + penalty = 8 + code = LAW_B2 + +/datum/law/damage/illegalupload + name = "2C-1 ILLEGAL UPLOAD" + penalty = 10 + code = LAW_C1 + +/datum/law/damage/grandsabotage + name = "2C-2 GRAND SABOTAGE" + penalty = 15 + code = LAW_C2 + death = TRUE + +/datum/law/theft + mothercrime = LAW_THEFT + +/datum/law/theft/petty + name = "3A-1 PETTY THEFT" + penalty = 3 + code = LAW_A1 + +/datum/law/theft/full + name = "3B-1 THEFT" + penalty = 5 + code = LAW_B1 + +/datum/law/theft/grand + name = "3C-1 GRAND THEFT" + penalty = 15 + code = LAW_C1 + +/datum/law/contraband + mothercrime = LAW_CONTRABAND + +/datum/law/contraband/makeshiftcons + name = "4A-1 MAKESHIFT/CONSOLES" + penalty = 5 + code = LAW_A1 + +/datum/law/contraband/weaponexpl + name = "4B-1 WEAPONS/EXPLOSIVES" + penalty = 8 + code = LAW_B1 + demotion = TRUE + +/datum/law/contraband/mechs + name = "4C-1 COMBAT GEAR/MECHS" + penalty = 10 + code = LAW_C1 + demotion = TRUE + +/datum/law/contraband/enemycontraband + name = "4C-2 ENEMY CONTRABAND" + penalty = 10 + code = LAW_C2 + demotion = TRUE + +/datum/law/trespass + mothercrime = LAW_TRESPASS + +/datum/law/trespass/minor + name = "5A-1 MINOR TRESPASS" + penalty = 3 + code = LAW_A1 + +/datum/law/trespass/bande + name = "5A-2 B&E" + penalty = 4 + code = LAW_A2 + +/datum/law/trespass/full + name = "5B-1 TRESPASS" + penalty = 6 + code = LAW_B1 + +/datum/law/trespass/major + name = "5C-1 MAJOR TRESPASS" + penalty = 10 + code = LAW_C1 + +/datum/law/escape + mothercrime = LAW_ESCAPE + +/datum/law/escape/resist + name = "6A-1 RESISTING" + penalty = 5 + code = LAW_A1 + +/datum/law/escape/full + name = "6B-1 ESCAPE" + penalty = 5 + code = LAW_B1 + +/datum/law/escape/interfere + name = "6B-2 INTERFERENCE" + penalty = 10 + code = LAW_B2 + +/datum/law/escape/grand + name = "6C-1 GRAND ESCAPE" + penalty = 15 + code = LAW_C1 + death = TRUE + +/datum/law/escape/deimplant + name = "6C-2 DEIMPLANTING" + penalty = 15 + code = LAW_C2 + +/datum/law/insub + mothercrime = LAW_INSUB + +/datum/law/insub/comms + name = "7A-1 MISUSE COMMS" + penalty = 0 + code = LAW_A1 + +/datum/law/insub/insub + name = "7A-2 INSUBORD" + penalty = 5 + demotion = TRUE + code = LAW_A2 + +/datum/law/insub/framing + name = "7B-1 FRAMING" + penalty = 0 + code = LAW_B1 + +/datum/law/insub/abusepower + name = "7C-1 ABUSE POWER" + penalty = 0 + demotion = TRUE + code = LAW_C1 + +/datum/law/insub/enemy + name = "7C-2 ENEMY OF CORP" + penalty = 15 + death = TRUE + code = LAW_C2 \ No newline at end of file diff --git a/code/game/objects/items/trader.dm b/code/game/objects/items/trader.dm index d366139b68e..ecf9df37841 100644 --- a/code/game/objects/items/trader.dm +++ b/code/game/objects/items/trader.dm @@ -8,21 +8,6 @@ name = "trader coin" icon_state = "coin_mythril" -/obj/item/weapon/storage/trader_marauder - name = "box of Marauder circuits" - desc = "All in one box!" - icon = 'icons/obj/storage/smallboxes.dmi' - inhand_states = list("left_hand" = 'icons/mob/in-hand/left/boxes_and_storage.dmi', "right_hand" = 'icons/mob/in-hand/right/boxes_and_storage.dmi') - icon_state = "box_of_doom" - item_state = "box_of_doom" - -/obj/item/weapon/storage/trader_marauder/New() //Because we're good jews, they won't be able to finish the marauder. The box is missing a circuit. - ..() - new /obj/item/weapon/circuitboard/mecha/marauder(src) - new /obj/item/weapon/circuitboard/mecha/marauder/peripherals(src) - //new /obj/item/weapon/circuitboard/mecha/marauder/targeting(src) - new /obj/item/weapon/circuitboard/mecha/marauder/main(src) - /obj/item/weapon/storage/trader_chemistry name = "chemist's pallet" desc = "Everything you need to make art." @@ -94,14 +79,6 @@ else new wonder_clothing(src) -/*/obj/structure/cage/with_random_slime - ..() - - add_mob - -/mob/living/carbon/slime/proc/randomSlime() -*/ - /area/vault/mecha_graveyard /obj/item/weapon/disk/shuttle_coords/vault/mecha_graveyard @@ -456,84 +433,6 @@ var/global/list/alcatraz_stuff = list( mob_path = null bonus_path = /mob/living/carbon/human/frankenstein -/*/obj/item/device/law_planner Scapped, but maybe in the future - name = "law planning frame" - desc = "A large data pad with buttons for crimes. Used for planning a brig sentence." - w_class = W_CLASS_SMALL - origin_tech = Tc_PROGRAMMING + "=6" - icon = 'icons/obj/pda.dmi' - icon_state = "aicard" - item_state = "electronic" - req_access = list(access_brig) - var/announce = 1 //0 = Off, 1 = On select, 2 = On upload - var/start_timer = FALSE //If true, automatically start the timer on upload - var/datum/data/record/upload_crimes = null //If has DNA, will look for an associated datacore file and upload crimes - var/list/rapsheet = list() - var/total_time = 0 - - var/list/minor_crimes = list( - "RESISTING ARREST"=2, - "PETTY CRIME"=3, - "DRUGGING"=4, - "POSSESSION"=5, - "MANHUNT"=5, - "ESCAPE"=5, - "FRAMING"=5, - "WORKPLACE HAZARD"=5, - "ASSAULT"=6, - "POSS. WEAPON"=7, - "POSS. EXPLOSIVE"=8) - var/list/major_crimes = list( - "B&E RESTRICTED"=10, - "INTERFERENCE"=10, - "UNLAWFUL UPLOAD"=10, - "ABUSE OF POWER"=10, - "ASSAULT ON SEC"=10, - "MAJOR TRESPASS"=10, - "MAJOR B&E"=15, - "GRAND THEFT"=15) - -/obj/item/device/law_planner/proc/announce() - say(english_list(rapsheet)) - say("[total_time] minutes.") - -/obj/item/device/law_planner/afterattack(var/atom/A, var/mob/user, var/proximity_flag) - if(!proximity_flag) - to_chat(user, "You can't seem to reach \the [A].") - return 0 - if(!allowed) - to_chat(user, "You must wear your ID!") - return 0 - if(ishuman(A)&&!(A==user)) - for(var/datum/data/record/E in data_core.security) - if(E.fields["name"] == A.name) - say("Verified. Found record match for [A].") - upload_crimes = E - if(istype(A,/obj/machinery/door_timer)) - if(announce==2) - announce() - if(upload_crimes) - upload_crimes.fields["criminal"] = "Incarcerated" - var/counter = 1 - while(upload_crimes.fields["com_[counter]"]) - counter++ - upload_crimes.fields["com_[counter]"] = text("Made by [user] (Automated) on [time2text(world.realtime, "DDD MMM DD")]
[english_list(rapsheet)]") - var/obj/machinery/door_timer/D = A - if(D.timeleft()) - //We're adding time - D.releasetime += total_time*60 - else - //Setting time - D.timeset(total_time*60) - if(start_timer && !D.timing) - D.timer_start() - upload_crimes = null - rapsheet = null - total_time = null - else - ..()*/ - - /obj/item/weapon/boxofsnow name = "box of winter" desc = "It has a single red button on top. Probably want to be careful where you open this." diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 41d4e88e2c5..0dcbb80579d 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -224,6 +224,7 @@ "/obj/item/device/hailer", "/obj/item/weapon/melee/telebaton", "/obj/item/device/gps/secure", + "/obj/item/device/law_planner", "/obj/item/clothing/accessory/holobadge", "/obj/item/weapon/autocuffer", "/obj/item/weapon/depocket_wand", diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 13ae5e2ee57..9c806bd68ec 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -554,6 +554,7 @@ new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/taperoll/police(src) new /obj/item/device/hailer(src) + new /obj/item/device/law_planner(src) /obj/item/weapon/storage/box/large/detectivegear name = "detective essentials" diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index c78cc96e83f..5ff00717f3d 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -50,4 +50,4 @@ temp_glassairlock.prison_open() for(var/obj/machinery/door_timer/temp_timer in A) - temp_timer.releasetime = 1 \ No newline at end of file + temp_timer.timeleft = 0 \ No newline at end of file diff --git a/config-example/config.txt b/config-example/config.txt index a32c50ce615..250b38bdf8a 100644 --- a/config-example/config.txt +++ b/config-example/config.txt @@ -313,15 +313,15 @@ SKIP_VAULT_GENERATION ## SHUT_UP_AUTOMATIC_DIAGNOSTIC_AND_ANNOUNCEMENT_SYSTEM ## Uncomment to disable the lovely robotic voice that tells you the time at the start of every shift. ## Recommended for your sanity if you start the server a lot for testing things. -#SHUT_UP_AUTOMATIC_DIAGNOSTIC_AND_ANNOUNCEMENT_SYSTEM +SHUT_UP_AUTOMATIC_DIAGNOSTIC_AND_ANNOUNCEMENT_SYSTEM ## NO_LOBBY_MUSIC ## Uncomment to never play lobby music. Useful if you use guest keys to multiaccount-test stuff, since you can't use client preferences for those. -#NO_LOBBY_MUSIC +NO_LOBBY_MUSIC ## NO_AMBIENCE ## Same as above. -#NO_AMBIENCE +NO_AMBIENCE ## ENABLE_ROUNDSTART_AWAY_MISSIONS ## Uncomment to genereate an away mission at the beginning of each round diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 0d35235a72b..c8738ded840 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/nano/css/shared.css b/nano/css/shared.css index 959f85b50a3..52c594819c2 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -593,3 +593,19 @@ th.misc { line-height: 110%; font-size: 10px; } + +/* Law Frame */ +.redButton { + width:112px; + background: #ea0000; +} + +.yellowButton { + width:112px; + background: #cacc00; +} + +.greenButton { + width:112px; + background: #2f943c; +} \ No newline at end of file diff --git a/nano/templates/lawplanner.tmpl b/nano/templates/lawplanner.tmpl new file mode 100644 index 00000000000..83803d46cb3 --- /dev/null +++ b/nano/templates/lawplanner.tmpl @@ -0,0 +1,194 @@ +
+ {{if data.perp}} +
+ Record: +
+
+ {{:data.perp}} {{:helper.link('X', null, {'clear' : 'record'})}} +
+ {{/if}} + {{if data.timearrest}} +
+ Time of Arrest: +
+
+ {{:data.arresttime}} {{:helper.link('X', null, {'clear' : 'arresttime'})}} +
+ {{/if}} +
+ Rapsheet: +
+
+ {{:data.crimes}} ({{:data.timer}}) {{:helper.link('X', null, {'clear' : 'rapsheet'})}} +
+
+
+ {{:helper.link('Announce Charges', 'volume-on', {'toggle' : 'announce'},null, data.announce ? 'greenBackground' : null)}} + {{:helper.link('Autostart Celltimer', 'play', {'toggle' : 'starttimer'},null, data.starttimer ? 'greenBackground' : null)}} + {{:helper.link('Time Arrest', 'clock', {'toggle' : 'timearrest'},null, data.timearrest ? 'greenBackground' : null)}} +
+
+
+
+ Assault +
+
+ {{:helper.link('MINOR ASSAULT', null,{'assault':1},null, 'greenButton')}} +
+
+ {{:helper.link('ASSAULT', null,{'assault':2},null, 'greenButton')}} +
+
+ {{:helper.link('ABDUCTION', null,{'assault':3},null, 'yellowButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'yellowButton')}} +
+
+ {{:helper.link('MANSLAUGHTER', null,{'assault':5},null, 'redButton')}} +
+
+ {{:helper.link('MURDER', null,{'assault':6},null, 'redButton')}} +
+
+
+
+ Damage +
+
+ {{:helper.link('VANDALISM', null,{'damage':1},null, 'greenButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'greenButton')}} +
+
+ {{:helper.link('NEGLIGANCE', null,{'damage':3},null, 'yellowButton')}} +
+
+ {{:helper.link('SABOTAGE', null,{'damage':4},null, 'yellowButton')}} +
+
+ {{:helper.link('UNAUTH UPLOAD', null,{'damage':5},null, 'redButton')}} +
+
+ {{:helper.link('GRAND SABOTAGE', null,{'damage':6},null, 'redButton')}} +
+
+
+
+ Theft +
+
+ {{:helper.link('PETTY THEFT', null,{'theft':1},null, 'greenButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'greenButton')}} +
+
+ {{:helper.link('THEFT', null,{'theft':3},null, 'yellowButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'yellowButton')}} +
+
+ {{:helper.link('GRAND THEFT', null,{'theft':5},null, 'redButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'redButton')}} +
+
+
+
+ Contraband +
+
+ {{:helper.link('MAKESHIFT WEP', null,{'contraband':1},null, 'greenButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'greenButton')}} +
+
+ {{:helper.link('WEAPON/EXPLOS', null,{'contraband':3},null, 'yellowButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'yellowButton')}} +
+
+ {{:helper.link('DISTRIB/MECHS', null,{'contraband':5},null, 'redButton')}} +
+
+ {{:helper.link('ENEMY CONTRAB', null,{'contraband':6},null, 'redButton')}} +
+
+
+
+
+
+ Trespass +
+
+ {{:helper.link('MINOR TRESPASS', null,{'trespass':1},null, 'greenButton')}} +
+
+ {{:helper.link(' ', null,null,null, 'greenButton')}} +
+
+ {{:helper.link('TRESPASS', null,{'trespass':3},null, 'yellowButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'yellowButton')}} +
+
+ {{:helper.link('MAJOR TRESPASS', null,{'trespass':5},null, 'redButton')}} +
+
+ {{:helper.link(' ', null,null,null, 'redButton')}} +
+
+
+
+ Escape +
+
+ {{:helper.link('RESIST ARREST', null,{'escape':1},null, 'greenButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'greenButton')}} +
+
+ {{:helper.link('ESCAPE', null,{'escape':3},null, 'yellowButton')}} +
+
+ {{:helper.link('INTERFERENCE', null,{'escape':4},null, 'yellowButton')}} +
+
+ {{:helper.link('GRAND ESCAPE', null,{'escape':5},null, 'redButton')}} +
+
+ {{:helper.link('DEIMPLANTING', null,{'escape':6},null, 'redButton')}} +
+
+
+
+ Insubordination +
+
+ {{:helper.link('MISUSE COMMS', null,{'insubordination':1},null, 'greenButton')}} +
+
+ {{:helper.link('INSUBORD',null,{'insubordination':2},null, 'greenButton')}} +
+
+ {{:helper.link('FRAMING', null,{'insubordination':3},null, 'yellowButton')}} +
+
+ {{:helper.link(' ',null,null,null, 'yellowButton')}} +
+
+ {{:helper.link('POWER ABUSE', null,{'insubordination':5},null, 'redButton')}} +
+
+ {{:helper.link('ENEMY OF CORP',null,{'insubordination':6},null, 'redButton')}} +
+
+
\ No newline at end of file diff --git a/vgstation13.dme b/vgstation13.dme index 1c6ef78c0e8..9aee3c0e1b4 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -838,6 +838,7 @@ #include "code\game\objects\items\policetape.dm" #include "code\game\objects\items\potions.dm" #include "code\game\objects\items\powercreeper_packet.dm" +#include "code\game\objects\items\sec_lawplanner.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\slime_heart.dm" #include "code\game\objects\items\toys.dm"