mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 02:16:05 +00:00
Law Planning Frame (#26435)
* progress * Law Planning Frame * cleanup * Tweaks * Done * cleaning up from rebase * Thank you for squashing
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 = "<HTML><BODY><TT>"
|
||||
|
||||
@@ -148,10 +149,10 @@
|
||||
dat += "<a href='?src=\ref[src];timing=1'>Activate Timer and close door</a><br/>"
|
||||
|
||||
|
||||
dat += {"Time Left: [(minute ? text("[minute]:") : null)][second] <br/>
|
||||
dat += {"Time Left: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)] <br/>
|
||||
<a href='?src=\ref[src];tp=-60'>-</a> <a href='?src=\ref[src];tp=-1'>-</a> <a href='?src=\ref[src];tp=1'>+</a> <A href='?src=\ref[src];tp=60'>+</a><br/>"}
|
||||
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 += "<br/><A href='?src=\ref[src];fc=1'>Flash Charging</A>"
|
||||
else
|
||||
dat += "<br/><A href='?src=\ref[src];fc=1'>Activate Flash</A>"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
384
code/game/objects/items/sec_lawplanner.dm
Normal file
384
code/game/objects/items/sec_lawplanner.dm
Normal file
@@ -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)] <B>\The [src]</B> beeps, \"This inmate is eligible for execution.\"")
|
||||
|
||||
if(initial(L.demotion))
|
||||
visible_message("[bicon(src)] <B>\The [src]</B> beeps, \"This inmate is eligible for demotion.\"")
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/device/law_planner/proc/announce()
|
||||
visible_message("[bicon(src)] <B>\The [src]</B> beeps, \"Charges: [english_list(rapsheet)]")
|
||||
visible_message("[bicon(src)] <B>\The [src]</B> 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, "<span class='warning'>You must wear your ID!</span>")
|
||||
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)] <B>\The [src]</B> 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)] <B>\The [src]</B> beeps, \"Verified. Found record match for [A].")
|
||||
upload_crimes = E
|
||||
timing = 0
|
||||
return 1
|
||||
visible_message("[bicon(src)] <B>\The [src]</B> 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)] <B>\The [src]</B> 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)] <B>\The [src]</B> 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)])":""]<BR>[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)] <B>\The [src]</B> 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
|
||||
@@ -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, "<span class='warning'>You can't seem to reach \the [A].</span>")
|
||||
return 0
|
||||
if(!allowed)
|
||||
to_chat(user, "<span class='warning'>You must wear your ID!</span>")
|
||||
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")]<BR>[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."
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -50,4 +50,4 @@
|
||||
temp_glassairlock.prison_open()
|
||||
|
||||
for(var/obj/machinery/door_timer/temp_timer in A)
|
||||
temp_timer.releasetime = 1
|
||||
temp_timer.timeleft = 0
|
||||
@@ -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
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 40 KiB |
@@ -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;
|
||||
}
|
||||
194
nano/templates/lawplanner.tmpl
Normal file
194
nano/templates/lawplanner.tmpl
Normal file
@@ -0,0 +1,194 @@
|
||||
<div class="item">
|
||||
{{if data.perp}}
|
||||
<div class="itemLabel">
|
||||
Record:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class='average'>{{:data.perp}}</span> {{:helper.link('X', null, {'clear' : 'record'})}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{if data.timearrest}}
|
||||
<div class="itemLabel">
|
||||
Time of Arrest:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
<span class='average'>{{:data.arresttime}}</span> {{:helper.link('X', null, {'clear' : 'arresttime'})}}
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="itemLabel">
|
||||
Rapsheet:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:data.crimes}} ({{:data.timer}}) {{:helper.link('X', null, {'clear' : 'rapsheet'})}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
{{: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)}}
|
||||
</div>
|
||||
<div class="item">
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Assault
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MINOR ASSAULT', null,{'assault':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('ASSAULT', null,{'assault':2},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('ABDUCTION', null,{'assault':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MANSLAUGHTER', null,{'assault':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MURDER', null,{'assault':6},null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Damage
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('VANDALISM', null,{'damage':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('NEGLIGANCE', null,{'damage':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('SABOTAGE', null,{'damage':4},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('UNAUTH UPLOAD', null,{'damage':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('GRAND SABOTAGE', null,{'damage':6},null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Theft
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('PETTY THEFT', null,{'theft':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('THEFT', null,{'theft':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('GRAND THEFT', null,{'theft':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Contraband
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MAKESHIFT WEP', null,{'contraband':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('WEAPON/EXPLOS', null,{'contraband':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('DISTRIB/MECHS', null,{'contraband':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('ENEMY CONTRAB', null,{'contraband':6},null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Trespass
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MINOR TRESPASS', null,{'trespass':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ', null,null,null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('TRESPASS', null,{'trespass':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MAJOR TRESPASS', null,{'trespass':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ', null,null,null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Escape
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('RESIST ARREST', null,{'escape':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('ESCAPE', null,{'escape':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('INTERFERENCE', null,{'escape':4},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('GRAND ESCAPE', null,{'escape':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('DEIMPLANTING', null,{'escape':6},null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
<div style="float: left; width: 25%;">
|
||||
<div class="itemLabel">
|
||||
Insubordination
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('MISUSE COMMS', null,{'insubordination':1},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('INSUBORD',null,{'insubordination':2},null, 'greenButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('FRAMING', null,{'insubordination':3},null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link(' ',null,null,null, 'yellowButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('POWER ABUSE', null,{'insubordination':5},null, 'redButton')}}
|
||||
</div>
|
||||
<div class="line">
|
||||
{{:helper.link('ENEMY OF CORP',null,{'insubordination':6},null, 'redButton')}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user