Law Planning Frame (#26435)

* progress

* Law Planning Frame

* cleanup

* Tweaks

* Done

* cleaning up from rebase

* Thank you for squashing
This commit is contained in:
Kurfursten
2020-05-27 17:11:35 -05:00
committed by GitHub
parent 7bad111f31
commit dac596cda9
13 changed files with 649 additions and 158 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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."

View File

@@ -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",

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View 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>

View File

@@ -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"