Merge remote-tracking branch 'upstream/dev' into power-net

Conflicts:
	code/game/machinery/recharger.dm
This commit is contained in:
mwerezak
2014-07-21 19:40:23 -04:00
77 changed files with 1845 additions and 1398 deletions
-1
View File
@@ -838,7 +838,6 @@
#include "code\modules\events\money_hacker.dm"
#include "code\modules\events\money_lotto.dm"
#include "code\modules\events\money_spam.dm"
#include "code\modules\events\organ_failure.dm"
#include "code\modules\events\prison_break.dm"
#include "code\modules\events\radiation_storm.dm"
#include "code\modules\events\rogue_drones.dm"
-3
View File
@@ -1,9 +1,6 @@
// BEGIN_INTERNALS
/*
MAP_ICON_TYPE: 0
LAST_COMPILE_VERSION: 506.1247
DIR: maps
LAST_COMPILE_TIME: 1405542427
AUTO_FILE_DIR: OFF
*/
// END_INTERNALS
+43 -14
View File
@@ -22,20 +22,21 @@
var/dat = "<table border='0' align='left'>"
var/i = 0
for(var/datum/file/F in filelist)
i++
if(i==1)
dat += "<tr>"
if(i>= 6)
i = 0
dat += "</tr>"
continue
dat += {"
<td>
<center><a href='?src=\ref[src];[fileop]=\ref[F]'>
<img src=\ref[F.image]><br>
<span>[F.name]</span>
</a></center>
</td>"}
if(!F.hidden_file)
i++
if(i==1)
dat += "<tr>"
if(i>= 6)
i = 0
dat += "</tr>"
continue
dat += {"
<td>
<center><a href='?src=\ref[src];[fileop]=\ref[F]'>
<img src=\ref[F.image]><br>
<span>[F.name]</span>
</a></center>
</td>"}
dat += "</tr></table>"
return dat
@@ -164,6 +165,8 @@
<body><div style='width:640px;height:480px; border:2px solid black;padding:8px;background-position:center;background-image:url(\ref['nano/images/uiBackground.png'])'>"}
dat += generate_status_bar()
var/list/files = list_files()
if(current)
dat +=window(current.name,buttonbar(),filegrid(files))
@@ -175,6 +178,32 @@
usr << browse(dat, "window=\ref[computer];size=670x510")
onclose(usr, "\ref[computer]")
// STATUS BAR
// Small 16x16 icons representing status of components, etc.
// Currently only used by battery icon
// TODO: Add more icons!
/datum/file/program/ntos/proc/generate_status_bar()
var/dat = ""
// Battery level icon
switch(computer.check_battery_status())
if(-1)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_none.gif']>"
if(0 to 5)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_5.gif']>"
if(6 to 20)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_20.gif']>"
if(21 to 40)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_40.gif']>"
if(41 to 60)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_60.gif']>"
if(61 to 80)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_80.gif']>"
if(81 to 100)
dat += "<img src=\ref['icons/ntos/battery_icons/batt_100.gif']>"
dat += "<br>"
return dat
/datum/file/program/ntos/Topic(href, list/href_list)
if(!interactable() || ..(href,href_list))
return
+125 -19
View File
@@ -91,29 +91,127 @@
return
..(I,user)
proc/insert(var/obj/item/weapon/card/card)
// cardslot.insert(card, slot)
// card: The card obj you want to insert (usually your ID)
// slot: Which slot to insert into (1: reader, 2: writer, 3: auto), 3 default
proc/insert(var/obj/item/weapon/card/card, var/slot = 3)
if(!computer)
return 0
if(reader != null)
usr << "There is already something in the slot!"
// This shouldn't happen, just in case..
if(slot == 2 && !dualslot)
usr << "This device has only one card slot"
return 0
if(istype(card,/obj/item/weapon/card/emag)) // emag reader slot
usr << "You insert \the [card], and the computer grinds, sparks, and beeps. After a moment, the card ejects itself."
computer.emagged = 1
return 1
var/mob/living/L = usr
L.drop_item()
card.loc = src
reader = card
proc/remove()
reader.loc = loc
var/mob/living/carbon/human/user = usr
if(istype(user) && !user.get_active_hand())
user.put_in_hands(reader)
else
reader.loc = computer.loc
reader = null
if(istype(card,/obj/item/weapon/card/emag)) // emag reader slot
if(!writer)
usr << "You insert \the [card], and the computer grinds, sparks, and beeps. After a moment, the card ejects itself."
computer.emagged = 1
return 1
else
usr << "You are unable to insert \the [card], as the reader slot is occupied"
var/mob/living/L = usr
switch(slot)
if(1)
if(equip_to_reader(card, L))
usr << "You insert the card into reader slot"
else
usr << "There is already something in the reader slot."
if(2)
if(equip_to_writer(card, L))
usr << "You insert the card into writer slot"
else
usr << "There is already something in the reader slot."
if(3)
if(equip_to_reader(card, L))
usr << "You insert the card into reader slot"
else if (equip_to_writer(card, L) && dualslot)
usr << "You insert the card into writer slot"
else if (dualslot)
usr << "There is already something in both slots."
else
usr << "There is already something in the reader slot."
// Usage of insert() preferred, as it also tells result to the user.
proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L)
if(!reader)
L.drop_item()
card.loc = src
reader = card
return 1
return 0
proc/equip_to_writer(var/obj/item/weapon/card/card, var/mob/living/L)
if(!writer && dualslot)
L.drop_item()
card.loc = src
writer = card
return 1
return 0
// cardslot.remove(slot)
// slot: Which slot to remove card(s) from (1: reader only, 2: writer only, 3: both [works even with one card], 4: reader and if empty then writer ), 3 default
proc/remove(var/slot = 3)
var/mob/living/L = usr
switch(slot)
if(1)
if (remove_reader(L))
L << "You remove the card from reader slot"
else
L << "There is no card in the reader slot"
if(2)
if (remove_writer(L))
L << "You remove the card from writer slot"
else
L << "There is no card in the writer slot"
if(3)
if (remove_reader(L))
if (remove_writer(L))
L << "You remove cards from both slots"
else
L << "You remove the card from reader slot"
else
if(remove_writer(L))
L << "You remove the card from writer slot"
else
L << "There are no cards in both slots"
if(4)
if (!remove_reader(L))
if (remove_writer(L))
L << "You remove the card from writer slot"
else if (!dualslot)
L << "There is no card in the reader slot"
else
L << "There are no cards in both slots"
else
L << "You remove the card from reader slot"
proc/remove_reader(var/mob/living/L)
if(reader)
reader.loc = loc
if(istype(L) && !L.get_active_hand())
L.put_in_hands(reader)
else
reader.loc = computer.loc
reader = null
return 1
return 0
proc/remove_writer(var/mob/living/L)
if(writer && dualslot)
writer.loc = loc
if(istype(L) && !L.get_active_hand())
L.put_in_hands(writer)
else
writer.loc = computer.loc
writer = null
return 1
return 0
// Authorizes the user based on the computer's requirements
proc/authenticate()
@@ -133,6 +231,13 @@
desc = "Contains slots for inserting magnetic swipe cards for reading and writing."
dualslot = 1
/*
// Atlantis: Reworked card manipulation a bit.
// No need for separated code for dual and single readers.
// Both is handled in single-slot reader code now, thanks to the "dualslot" var.
// Leaving this code here if someone wants to somehow use it, just uncomment.
insert(var/obj/item/weapon/card/card,var/slot = 0)
if(!computer)
return 0
@@ -194,5 +299,6 @@
user.put_in_hands(card)
else
card.loc = computer.loc
*/
+10
View File
@@ -449,6 +449,16 @@
overlays += kb
name = initial(name) + " (orange screen of death)"
//Returns percentage of battery charge remaining. Returns -1 if no battery is installed.
proc/check_battery_status()
if (battery)
var/obj/item/weapon/cell/B = battery
return round(B.charge / (B.maxcharge / 100))
else
return -1
/obj/machinery/computer3/wall_comp
name = "terminal"
icon = 'icons/obj/computer3.dmi'
@@ -275,3 +275,7 @@
else
usr << "The screen turns to static."
return
// Atlantis: Required for camnetkeys to work.
/datum/file/program/security/hidden
hidden_file = 1
@@ -253,9 +253,9 @@
if("remove" in href_list)
var/which = href_list["remove"]
if(which == "writer")
computer.cardslot.remove(computer.cardslot.writer)
computer.cardslot.remove(2)
else
computer.cardslot.remove(computer.cardslot.reader)
computer.cardslot.remove(1)
auth = 0
if("insert" in href_list)
@@ -264,9 +264,9 @@
var/which = href_list["insert"]
if(which == "writer")
computer.cardslot.insert(card,1)
else
computer.cardslot.insert(card,2)
else
computer.cardslot.insert(card,1)
if("print" in href_list)
if (printing)
@@ -23,6 +23,7 @@
req_one_access = list(access_medical, access_forensics_lockers)
var/obj/item/weapon/card/id/scan = null
var/obj/item/weapon/card/id/scan2 = null
var/authenticated = null
var/rank = null
var/screen = null
@@ -56,7 +57,12 @@
if (temp)
dat = text("<TT>[src.temp]</TT><BR><BR><A href='?src=\ref[src];temp=1'>Clear Screen</A>")
else
dat = text("Confirm Identity: <A href='?src=\ref[];scan=1'>[]</A><HR>", src, (src.scan ? text("[]", src.scan.name) : "----------"))
dat = text("Confirm Identity (R): <A href='?src=\ref[];cardr=1'>[]</A><HR>", src, (scan ? text("[]", scan.name) : "----------"))
if (computer.cardslot.dualslot)
dat += text("Check Identity (W): <A href='?src=\ref[];cardw=1'>[]</A><BR>", src, (scan2 ? text("[]", scan2.name) : "----------"))
if(scan2 && !scan)
dat += text("<div class='notice'>Insert card into reader slot to log in.</div><br>")
if (src.authenticated)
switch(src.screen)
if(1.0)
@@ -165,19 +171,32 @@
if (href_list["temp"])
src.temp = null
if (href_list["scan"])
if (href_list["cardr"])
if (scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(scan)
computer.cardslot.remove(1)
else
scan.loc = get_turf(src)
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I)
computer.cardslot.insert(I, 1)
scan = I
if (href_list["cardw"])
if (scan2)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(2)
else
scan2.loc = get_turf(src)
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I, 2)
scan2 = I
else if (href_list["logout"])
src.authenticated = null
src.screen = null
@@ -19,6 +19,7 @@
req_one_access = list(access_security, access_forensics_lockers)
var/obj/item/weapon/card/id/scan = null
var/obj/item/weapon/card/id/scan2 = null
var/authenticated = null
var/rank = null
var/screen = null
@@ -49,9 +50,13 @@
return
usr.set_machine(src)
scan = computer.cardslot.reader
if (computer.cardslot.dualslot)
scan2 = computer.cardslot.writer
if(!interactable())
return
return
if (computer.z > 6)
usr << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!"
return
@@ -60,7 +65,11 @@
if (temp)
dat = text("<TT>[]</TT><BR><BR><A href='?src=\ref[];choice=Clear Screen'>Clear Screen</A>", temp, src)
else
dat = text("Confirm Identity: <A href='?src=\ref[];choice=Confirm Identity'>[]</A><HR>", src, (scan ? text("[]", scan.name) : "----------"))
dat = text("Confirm Identity (R): <A href='?src=\ref[];choice=Confirm Identity R'>[]</A><HR>", src, (scan ? text("[]", scan.name) : "----------"))
if (computer.cardslot.dualslot)
dat += text("Check Identity (W): <A href='?src=\ref[];choice=Confirm Identity W'>[]</A><BR>", src, (scan2 ? text("[]", scan2.name) : "----------"))
if(scan2 && !scan)
dat += text("<div class='notice'>Insert card into reader slot to log in.</div><br>")
if (authenticated)
switch(screen)
if(1.0)
@@ -100,9 +109,9 @@
if("Released")
background = "'background-color:#3BB9FF;'"
if("None")
background = "'background-color:#00FF7F;'"
if("")
background = "'background-color:#00FF00;'"
if("")
background = "'background-color:#00FF7F;'"
crimstat = "No Record."
dat += text("<tr style=[]><td><A href='?src=\ref[];choice=Browse Record;d_rec=\ref[]'>[]</a></td>", background, src, R, R.fields["name"])
dat += text("<td>[]</td>", R.fields["id"])
@@ -236,19 +245,32 @@ What a mess.*/
active1 = null
active2 = null
if("Confirm Identity")
if("Confirm Identity R")
if (scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(scan)
computer.cardslot.remove(1)
else
scan.loc = get_turf(src)
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I)
computer.cardslot.insert(I, 1)
scan = I
if("Confirm Identity W")
if (scan2)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(2)
else
scan2.loc = get_turf(src)
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I, 2)
scan2 = I
if("Log Out")
authenticated = null
screen = null
+1 -1
View File
@@ -13,7 +13,7 @@
var/image = 'icons/ntos/file.png' // determines the icon to use, found in icons/ntos
var/obj/machinery/computer3/computer // the parent computer, if fixed
var/obj/item/part/computer/storage/device // the device that is containing this file
var/hidden_file = 0 // Prevents file from showing up on NTOS program list.
var/drm = 0 // Copy protection, called by copy() and move()
var/readonly = 0 // Edit protection, called by edit(), which is just a failcheck proc
+109 -94
View File
@@ -213,58 +213,66 @@
if (istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
if(vendor_account)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
if(D)
var/transaction_amount = total()
if(transaction_amount <= D.money)
//transfer the money
D.money -= transaction_amount
vendor_account.money += transaction_amount
//Transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Purchase of Laptop"
if(transaction_amount > 0)
T.amount = "([transaction_amount])"
else
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Purchase of Laptop"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
newlap = new /obj/machinery/computer3/laptop/vended(src.loc)
choose_progs(C)
vend()
popup.close()
newlap.close_computer()
newlap = null
cardreader = 0
floppy = 0
radionet = 0
camera = 0
network = 0
power = 0
var/datum/money_account/CH = get_account(C.associated_account_number)
if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
if(vendor_account)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
if(D)
transfer_and_vend(D, C)
else
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
transfer_and_vend(CH, C)
// Transfers money and vends the laptop.
/obj/machinery/lapvend/proc/transfer_and_vend(var/datum/money_account/D, var/obj/item/weapon/card/C)
var/transaction_amount = total()
if(transaction_amount <= D.money)
//transfer the money
D.money -= transaction_amount
vendor_account.money += transaction_amount
//Transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Purchase of Laptop"
if(transaction_amount > 0)
T.amount = "([transaction_amount])"
else
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Purchase of Laptop"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
newlap = new /obj/machinery/computer3/laptop/vended(src.loc)
choose_progs(C)
vend()
popup.close()
newlap.close_computer()
newlap = null
cardreader = 0
floppy = 0
radionet = 0
camera = 0
network = 0
power = 0
else
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"
/obj/machinery/lapvend/proc/total()
var/total = 0
@@ -305,9 +313,10 @@
newlap.spawn_files += (/datum/file/program/card_comp)
if(access_heads in C.access)
newlap.spawn_files += (/datum/file/program/communications)
if(access_medical in C.access)
newlap.spawn_files += (/datum/file/program/crew)
if((access_medical in C.access) || (access_forensics_lockers in C.access)) //Gives detective the medical records program, but not the crew monitoring one.
newlap.spawn_files += (/datum/file/program/med_data)
if (access_medical in C.access)
newlap.spawn_files += (/datum/file/program/crew)
if(access_engine in C.access)
newlap.spawn_files += (/datum/file/program/powermon)
if(access_research in C.access)
@@ -320,6 +329,8 @@
newlap.spawn_files += (/datum/file/camnet_key/creed)
newlap.spawn_files += (/datum/file/program/arcade)
newlap.spawn_files += (/datum/file/camnet_key/entertainment)
//Atlantis: Each laptop gets "invisible" program/security - REQUIRED for camnetkeys to work.
newlap.spawn_files += (/datum/file/program/security/hidden)
newlap.update_spawn_files()
/obj/machinery/lapvend/proc/calc_reimburse(var/obj/item/device/laptop/L)
@@ -350,49 +361,53 @@
if (istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
if(vendor_account)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
if(D)
var/transaction_amount = total()
//transfer the money
D.money += transaction_amount
vendor_account.money -= transaction_amount
//Transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Return purchase of Laptop"
if(transaction_amount > 0)
T.amount = "([transaction_amount])"
var/datum/money_account/CH = get_account(C.associated_account_number)
if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
if(vendor_account)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
if(D)
transfer_and_reimburse(D)
else
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Return purchase of Laptop"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
del(relap)
vendmode = 0
cardreader = 0
floppy = 0
radionet = 0
camera = 0
network = 0
power = 0
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
transfer_and_reimburse(CH)
/obj/machinery/lapvend/proc/transfer_and_reimburse(var/datum/money_account/D)
var/transaction_amount = total()
//transfer the money
D.money += transaction_amount
vendor_account.money -= transaction_amount
//Transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Return purchase of Laptop"
if(transaction_amount > 0)
T.amount = "([transaction_amount])"
else
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Return purchase of Laptop"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
del(relap)
vendmode = 0
cardreader = 0
floppy = 0
radionet = 0
camera = 0
network = 0
power = 0
+32 -6
View File
@@ -81,12 +81,15 @@
than anything else in the game, atoms have separate procs
for AI shift, ctrl, and alt clicking.
*/
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
A.AIShiftClick(src)
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
A.AICtrlClick(src)
/mob/living/silicon/ai/AltClickOn(var/atom/A)
A.AIAltClick(src)
/mob/living/silicon/ai/MiddleClickOn(var/atom/A)
A.AIMiddleClick(src)
/*
The following criminally helpful code is just the previous code cleaned up;
@@ -103,7 +106,6 @@
Topic("aiDisable=7", list("aiDisable"="7"), 1)
return
/atom/proc/AICtrlClick()
return
@@ -113,18 +115,42 @@
else
Topic("aiDisable=4", list("aiDisable"="4"), 1)
/obj/machinery/power/apc/AICtrlClick() // turns off APCs.
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
Topic("breaker=1", list("breaker"="1"), 0) // 0 meaning no window (consistency! wait...)
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
src.enabled = !src.enabled
src.updateTurrets()
/atom/proc/AIAltClick()
return
/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors.
/obj/machinery/door/airlock/AIAltClick() // Electrifies doors.
if(!secondsElectrified)
// permenant shock
// permanent shock
Topic("aiEnable=6", list("aiEnable"="6"), 1) // 1 meaning no window (consistency!)
else
// disable/6 is not in Topic; disable/5 disables both temporary and permenant shock
// disable/6 is not in Topic; disable/5 disables both temporary and permanent shock
Topic("aiDisable=5", list("aiDisable"="5"), 1)
return
return
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
src.lethal = !src.lethal
src.updateTurrets()
/atom/proc/AIMiddleClick()
return
/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
if(!src.lights)
Topic("aiEnable=10", list("aiEnable"="10"), 1) // 1 meaning no window (consistency!)
else
Topic("aiDisable=10", list("aiDisable"="10"), 1)
return
//
// Override AdjacentQuick for AltClicking
//
/mob/living/silicon/ai/TurfAdjacent(var/turf/T)
return (cameranet && cameranet.checkTurfVis(T))
+5 -2
View File
@@ -249,14 +249,17 @@
/atom/proc/AltClick(var/mob/user)
var/turf/T = get_turf(src)
if(T && T.AdjacentQuick(user))
if(user.listed_turf == T)
if(T && user.TurfAdjacent(T))
if(user. == T)
user.listed_turf = null
else
user.listed_turf = T
user.client.statpanel = T.name
return
/mob/proc/TurfAdjacent(var/turf/T)
return T.AdjacentQuick(src)
/*
Misc helpers
@@ -844,11 +844,13 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling)
return 0
var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
if(!T) return 0
T.dna.real_name = T.real_name
changeling.absorbed_dna |= T.dna
if(T.species && !(T.species.name in changeling.absorbed_species))
changeling.absorbed_species += T.species.name
feedback_add_details("changeling_powers","ED")
return 1
+66 -6
View File
@@ -1,3 +1,15 @@
/mob/living/silicon/ai/var/max_locations = 5
/mob/living/silicon/ai/var/stored_locations[0]
/mob/living/silicon/ai/proc/InvalidTurf(turf/T as turf)
if(!T)
return 1
if(T.z == 2)
return 1
if(T.z > 6)
return 1
return 0
/mob/living/silicon/ai/proc/get_camera_list()
if(src.stat == 2)
@@ -38,6 +50,59 @@
return
/mob/living/silicon/ai/proc/ai_store_location(loc as text)
set category = "AI Commands"
set name = "Store Camera Location"
set desc = "Stores your current camera location by the given name"
loc = copytext(sanitize(loc), 1, MAX_MESSAGE_LEN)
if(!loc)
src << "\red Must supply a location name"
return
if(stored_locations.len >= max_locations)
src << "\red Cannot store additional locations. Remove one first"
return
if(loc in stored_locations)
src << "\red There is already a stored location by this name"
return
var/L = src.eyeobj.getLoc()
if (InvalidTurf(get_turf(L)))
src << "\red Unable to store this location"
return
stored_locations[loc] = L
src << "Location '[loc]' stored"
/mob/living/silicon/ai/proc/sorted_stored_locations()
return sortList(stored_locations)
/mob/living/silicon/ai/proc/ai_goto_location(loc in sorted_stored_locations())
set category = "AI Commands"
set name = "Goto Camera Location"
set desc = "Returns to the selected camera location"
if (!(loc in stored_locations))
src << "\red Location [loc] not found"
return
var/L = stored_locations[loc]
src.eyeobj.setLoc(L)
/mob/living/silicon/ai/proc/ai_remove_location(loc in sorted_stored_locations())
set category = "AI Commands"
set name = "Remove Camera Location"
set desc = "Removes the selected camera location"
if (!(loc in stored_locations))
src << "\red Location [loc] not found"
return
stored_locations.Remove(loc)
src << "Location [loc] removed"
// Used to allow the AI is write in mob names/camera name from the CMD line.
/datum/trackable
var/list/names = list()
@@ -55,12 +120,7 @@
for(var/mob/living/M in mob_list)
// Easy checks first.
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
var/turf/T = get_turf(M)
if(!T)
continue
if(T.z == 2)
continue
if(T.z > 6)
if(InvalidTurf(get_turf(M)))
continue
if(M == usr)
continue
+85 -79
View File
@@ -540,8 +540,8 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/proc/canAIControl()
return ((src.aiControlDisabled!=1) && (!src.isAllPowerCut()));
/obj/machinery/door/airlock/proc/canAIHack()
return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerCut()));
/obj/machinery/door/airlock/proc/canAIHack(var/user as mob)
return (isAI(user) && src.aiControlDisabled==1 && !hackProof && !src.isAllPowerCut());
/obj/machinery/door/airlock/proc/arePowerSystemsOn()
return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0)
@@ -651,12 +651,8 @@ About the new airlock wires panel:
return
/obj/machinery/door/airlock/attack_ai(mob/user as mob)
if(!src.canAIControl())
if(src.canAIHack())
src.hack(user)
return
else
user << "Airlock AI control has been blocked with a firewall. Unable to hack."
if (!check_synth_access(user))
return
//Separate interface for the AI.
user.set_machine(src)
@@ -772,7 +768,7 @@ About the new airlock wires panel:
user << "Alert cancelled. Airlock control has been restored without our assistance."
src.aiHacking=0
return
else if(!src.canAIHack())
else if(!src.canAIHack(user))
user << "We've lost our connection! Unable to hack airlock."
src.aiHacking=0
return
@@ -784,7 +780,7 @@ About the new airlock wires panel:
user << "Alert cancelled. Airlock control has been restored without our assistance."
src.aiHacking=0
return
else if(!src.canAIHack())
else if(!src.canAIHack(user))
user << "We've lost our connection! Unable to hack airlock."
src.aiHacking=0
return
@@ -794,7 +790,7 @@ About the new airlock wires panel:
user << "Alert cancelled. Airlock control has been restored without our assistance."
src.aiHacking=0
return
else if(!src.canAIHack())
else if(!src.canAIHack(user))
user << "We've lost our connection! Unable to hack airlock."
src.aiHacking=0
return
@@ -889,6 +885,17 @@ About the new airlock wires panel:
..(user)
return
/obj/machinery/door/airlock/proc/check_synth_access(mob/user as mob)
if(emagged)
user << "<span class='warning'>Unable to interface: Airlock is unresponsive.</span>"
return 0
if(!src.canAIControl())
if(src.canAIHack(user))
src.hack(user)
else
user << "<span class='warning'>Airlock AI control has been blocked with a firewall.</span>"
return 0
return 1
/obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0)
if(!nowindow)
@@ -951,7 +958,10 @@ About the new airlock wires panel:
src.signalers[wirenum] = null
if(istype(usr, /mob/living/silicon) && src.canAIControl())
if(istype(usr, /mob/living/silicon))
if (!check_synth_access(usr))
return
//AI
//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door, 8 door safties, 9 door speed
//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door, 8 door safties, 9 door speed
@@ -961,10 +971,11 @@ About the new airlock wires panel:
if(1)
//disable idscan
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
usr << "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways."
usr << "The IdScan wire has been cut - The IdScan feature is already disabled."
else if(src.aiDisabledIdScanner)
usr << "You've already disabled the IdScan feature."
usr << "The IdScan feature is already disabled."
else
usr << "The IdScan feature has been disabled."
src.aiDisabledIdScanner = 1
if(2)
//disrupt main power
@@ -981,38 +992,19 @@ About the new airlock wires panel:
if(4)
//drop door bolts
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
usr << "You can't drop the door bolts - The door bolt control wire has been cut."
usr << "The door bolt control wire has been cut - The door bolts are already dropped."
else if(src.locked)
usr << "The door bolts are already dropped."
else
src.lock()
usr << "The door bolts have been dropped."
if(5)
//un-electrify door
if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
usr << text("Can't un-electrify the airlock - The electrification wire is cut.")
else if(src.secondsElectrified==-1)
usr << text("The electrification wire is cut - Cannot un-electrify the door.")
else if(secondsElectrified != 0)
usr << "The door is now un-electrified."
src.secondsElectrified = 0
else if(src.secondsElectrified>0)
src.secondsElectrified = 0
if(8)
// Safeties! We don't need no stinking safeties!
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
usr << text("Control to door sensors is disabled.")
else if (src.safe)
safe = 0
else
usr << text("Firmware reports safeties already overriden.")
if(9)
// Door speed control
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
usr << text("Control to door timing circuitry has been severed.")
else if (src.normalspeed)
normalspeed = 0
else
usr << text("Door timing circurity already accellerated.")
if(7)
//close door
if(src.welded)
@@ -1023,17 +1015,31 @@ About the new airlock wires panel:
close()
else
open()
if(8)
// Safeties! We don't need no stinking safeties!
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
usr << text("Control to door sensors is disabled.")
else if (src.safe)
safe = 0
else
usr << text("Firmware reports safeties already overridden.")
if(9)
// Door speed control
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
usr << text("Control to door timing circuitry has been severed.")
else if (src.normalspeed)
normalspeed = 0
else
usr << text("Door timing circuity already accelerated.")
if(10)
// Bolt lights
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
usr << text("Control to door bolt lights has been severed.</a>")
usr << "The bolt lights wire has been cut - The door bolt lights are already disabled."
else if (src.lights)
lights = 0
usr << "The door bolt lights have been disabled."
else
usr << text("Door bolt lights are already disabled!")
usr << "The door bolt lights are already disabled!"
else if(href_list["aiEnable"])
var/code = text2num(href_list["aiEnable"])
@@ -1041,20 +1047,23 @@ About the new airlock wires panel:
if(1)
//enable idscan
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
usr << "You can't enable IdScan - The IdScan wire has been cut."
usr << "The IdScan wire has been cut - The IdScan feature cannot be enabled."
else if(src.aiDisabledIdScanner)
usr << "The IdScan feature has been enabled."
src.aiDisabledIdScanner = 0
else
usr << "The IdScan feature is not disabled."
usr << "The IdScan feature is already enabled."
if(4)
//raise door bolts
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
usr << text("The door bolt control wire is cut - you can't raise the door bolts.<br>\n")
usr << "The door bolt control wire has been cut - The door bolts cannot be raised."
else if(!src.locked)
usr << text("The door bolts are already up.<br>\n")
usr << "The door bolts are already raised."
else
src.unlock()
if(src.unlock())
usr << "The door bolts have been raised."
else
usr << "Unable to raise door bolts."
if(5)
//electrify door for 30 seconds
if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
@@ -1062,17 +1071,17 @@ About the new airlock wires panel:
else if(src.secondsElectrified==-1)
usr << text("The door is already indefinitely electrified. You'd have to un-electrify it before you can re-electrify it with a non-forever duration.<br>\n")
else if(src.secondsElectrified!=0)
usr << text("The door is already electrified. You can't re-electrify it while it's already electrified.<br>\n")
usr << text("The door is already electrified. Cannot re-electrify it while it's already electrified.<br>\n")
else
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Electrified the [name] at [x] [y] [z]</font>")
usr << "The door is now electrified for thirty seconds."
src.secondsElectrified = 30
spawn(10)
while (src.secondsElectrified>0)
src.secondsElectrified-=1
if(src.secondsElectrified<0)
src.secondsElectrified = 0
src.updateUsrDialog()
sleep(10)
if(6)
//electrify door indefinitely
@@ -1085,28 +1094,8 @@ About the new airlock wires panel:
else
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Electrified the [name] at [x] [y] [z]</font>")
usr << "The door is now electrified."
src.secondsElectrified = -1
if (8) // Not in order >.>
// Safeties! Maybe we do need some stinking safeties!
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
usr << text("Control to door sensors is disabled.")
else if (!src.safe)
safe = 1
src.updateUsrDialog()
else
usr << text("Firmware reports safeties already in place.")
if(9)
// Door speed control
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
usr << text("Control to door timing circuitry has been severed.")
else if (!src.normalspeed)
normalspeed = 1
src.updateUsrDialog()
else
usr << text("Door timing circurity currently operating normally.")
if(7)
//open door
if(src.welded)
@@ -1117,16 +1106,31 @@ About the new airlock wires panel:
open()
else
close()
if (8)
// Safeties! Maybe we do need some stinking safeties!
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
usr << text("Control to door sensors is disabled.")
else if (!src.safe)
safe = 1
else
usr << text("Firmware reports safeties already in place.")
if(9)
// Door speed control
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
usr << text("Control to door timing circuitry has been severed.")
else if (!src.normalspeed)
normalspeed = 1
else
usr << text("Door timing circuity currently operating normally.")
if(10)
// Bolt lights
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
usr << text("Control to door bolt lights has been severed.</a>")
usr << "The bolt lights wire has been cut - The door bolt lights cannot be enabled."
else if (!src.lights)
lights = 1
src.updateUsrDialog()
usr << "The door bolt lights have been enabled"
else
usr << text("Door bolt lights are already enabled!")
usr << "The door bolt lights are already enabled!"
add_fingerprint(usr)
update_icon()
@@ -1315,13 +1319,15 @@ About the new airlock wires panel:
update_icon()
/obj/machinery/door/airlock/proc/unlock(var/forced=0)
if (!src.locked) return
if (!src.locked) return 0
if(forced || src.arePowerSystemsOn()) //only can raise bolts if power's on
src.locked = 0
for(var/mob/M in range(1,src))
M.show_message("You hear a click from the bottom of the door.", 2)
update_icon()
return 1
return 0
/obj/machinery/door/airlock/New()
..()
+19 -52
View File
@@ -10,6 +10,9 @@ obj/machinery/recharger
var/power_rating = 15000 //15 kW
var/obj/item/charging = null
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell)
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0"
obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
if(istype(user,/mob/living/silicon))
@@ -22,16 +25,11 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
if(allowed)
if(charging)
return
// Checks to make sure he's not in space doing it, and that the area got proper power.
var/area/a = get_area(src)
if(!isarea(a))
if(!isarea(a) || (a.power_equip == 0 && !a.unlimited_power))
user << "\red The [name] blinks red as you try to insert the item!"
return
if(a.power_equip == 0 && !a.unlimited_power)
user << "\red The [name] blinks red as you try to insert the item!"
return
if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow))
user << "<span class='notice'>Your gun's recharge port was removed to make room for a miniaturized reactor.</span>"
return
@@ -74,44 +72,41 @@ obj/machinery/recharger/process()
if(istype(charging, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = charging
if(!E.power_supply.fully_charged())
icon_state = "recharger1"
icon_state = icon_state_charging
var/charge_used = E.power_supply.give(power_rating*CELLRATE)
use_power(charge_used/CELLRATE)
else
icon_state = "recharger2"
icon_state = icon_state_charged
return
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
if(B.bcell)
if(!B.bcell.fully_charged())
icon_state = "recharger1"
icon_state = icon_state_charging
var/charge_used = B.bcell.give(power_rating*CELLRATE)
use_power(charge_used/CELLRATE)
else
icon_state = "recharger2"
else
icon_state = "recharger3"
icon_state = icon_state_charged
return
if(istype(charging, /obj/item/device/laptop))
var/obj/item/device/laptop/L = charging
if(!L.stored_computer.battery.fully_charged())
icon_state = "recharger1"
icon_state = icon_state_charging
var/charge_used = L.stored_computer.battery.give(power_rating*CELLRATE)
use_power(charge_used/CELLRATE)
else
icon_state = "recharger2"
icon_state = icon_state_charged
return
if(istype(charging, /obj/item/weapon/cell))
var/obj/item/weapon/cell/C = charging
if(!C.fully_charged())
icon_state = "recharger1"
icon_state = icon_state_charging
var/charge_used = C.give(power_rating*CELLRATE)
use_power(charge_used/CELLRATE)
else
icon_state = "recharger2"
icon_state = icon_state_charged
return
obj/machinery/recharger/emp_act(severity)
if(stat & (NOPOWER|BROKEN) || !anchored)
..(severity)
@@ -130,45 +125,17 @@ obj/machinery/recharger/emp_act(severity)
obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
if(charging)
icon_state = "recharger1"
icon_state = icon_state_charging
else
icon_state = "recharger0"
icon_state = icon_state_idle
// Atlantis: No need for that copy-pasta code, just use var to store icon_states instead.
obj/machinery/recharger/wallcharger
name = "wall recharger"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0"
power_rating = 25000 //25 kW , It's more specialized than the standalone recharger but more powerful
power_rating = 25000 //25 kW , It's more specialized than the standalone recharger (guns and batons only) so make it more powerful
allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton)
obj/machinery/recharger/wallcharger/process()
if(stat & (NOPOWER|BROKEN) || !anchored)
return
if(charging)
if(istype(charging, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = charging
if(!E.power_supply.fully_charged())
icon_state = "wrecharger1"
var/charge_used = E.power_supply.give(power_rating*CELLRATE)
use_power(charge_used/CELLRATE)
else
icon_state = "wrecharger2"
return
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
if(B.bcell)
if(!B.bcell.fully_charged()) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti
icon_state = "wrecharger1"
var/charge_used = B.bcell.give(power_rating*CELLRATE)
use_power(charge_used/CELLRATE)
else
icon_state = "wrecharger2"
else
icon_state = "wrecharger0"
obj/machinery/recharger/wallcharger/update_icon()
if(charging)
icon_state = "wrecharger1"
else
icon_state = "wrecharger0"
icon_state_charged = "wrecharger2"
icon_state_charging = "wrecharger1"
icon_state_idle = "wrecharger0"
+3 -13
View File
@@ -1064,19 +1064,9 @@
if(!target_species || !target_department)
return
switch(target_species)
if("Skrell")
if(helmet) helmet.species_restricted = list("Skrell")
if(suit) suit.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
if("Human")
if(helmet) helmet.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox","Skrell")
if(suit) suit.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
if("Unathi")
if(helmet) helmet.species_restricted = list("Unathi")
if(suit) suit.species_restricted = list("Unathi")
if("Tajaran")
if(helmet) helmet.species_restricted = list("Tajaran")
if(suit) suit.species_restricted = list("Tajaran")
if(target_species)
if(helmet) helmet.refit_for_species(target_species)
if(suit) suit.refit_for_species(target_species)
switch(target_department)
if("Engineering")
+48 -41
View File
@@ -187,53 +187,60 @@
if (istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
if(check_accounts)
if(vendor_account)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
if(D)
var/transaction_amount = currently_vending.price
if(transaction_amount <= D.money)
//transfer the money
D.money -= transaction_amount
vendor_account.money += transaction_amount
//create entries in the two account transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Purchase of [currently_vending.product_name]"
if(transaction_amount > 0)
T.amount = "([transaction_amount])"
else
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Purchase of [currently_vending.product_name]"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
// Vend the item
src.vend(src.currently_vending, usr)
currently_vending = null
var/datum/money_account/CH = get_account(C.associated_account_number)
if (CH) // Only proceed if card contains proper account number.
if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
if(vendor_account)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
transfer_and_vend(D)
else
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
//Just Vend it.
transfer_and_vend(CH)
else
//Just Vend it.
usr << "\icon[src]<span class='warning'>Error: Unable to access your account. Please contact technical support if problem persists.</span>"
/obj/machinery/vending/proc/transfer_and_vend(var/datum/money_account/acc)
if(acc)
var/transaction_amount = currently_vending.price
if(transaction_amount <= acc.money)
//transfer the money
acc.money -= transaction_amount
vendor_account.money += transaction_amount
//create entries in the two account transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Purchase of [currently_vending.product_name]"
if(transaction_amount > 0)
T.amount = "([transaction_amount])"
else
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
acc.transaction_log.Add(T)
//
T = new()
T.target_name = acc.owner_name
T.purpose = "Purchase of [currently_vending.product_name]"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
// Vend the item
src.vend(src.currently_vending, usr)
currently_vending = null
else
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
usr << "\icon[src]<span class='warning'>Error: Unable to access your account. Please contact technical support if problem persists.</span>"
/obj/machinery/vending/attack_paw(mob/user as mob)
return attack_hand(user)
+2 -1
View File
@@ -1273,6 +1273,7 @@
else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
holder.icon_state = "odysseus10"
if(2)
if(diff==FORWARD)
user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
holder.icon_state = "odysseus13"
@@ -1293,4 +1294,4 @@
spawn_result()
..()
feedback_inc("mecha_odysseus_created",1)
return
return
+3 -1
View File
@@ -8,6 +8,8 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "glowshroomf"
layer = 2.1
l_color = "#003300"
var/endurance = 30
var/potency = 30
var/delay = 1200
@@ -44,7 +46,7 @@
processing_objects += src
SetLuminosity(round(potency/10))
SetLuminosity(round(potency/15))
lastTick = world.timeofday
/obj/effect/glowshroom/Del()
+12
View File
@@ -49,6 +49,18 @@
var/list/sprite_sheets = null
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
/* Species-specific sprite sheets for object and inhand sprites
Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called.
*/
var/list/sprite_sheets_obj = null
//Inhand is not as big a deal as the object sprites, so I'm not sure if these are worth the extra vars.
//Maybe in the future:
//var/list/sprite_sheets_inhand_l = null
//var/list/sprite_sheets_inhand_r = null
//var/icon_l_hand = 'icons/mob/items_lefthand.dmi'
//var/icon_r_hand = 'icons/mob/items_righthand.dmi'
/obj/item/device
icon = 'icons/obj/device.dmi'
+28 -17
View File
@@ -7,7 +7,7 @@
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user."
icon_state = "modkit"
var/parts = MODKIT_FULL
var/list/target_species = list("Human","Skrell")
var/target_species = "Human"
var/list/permitted_types = list(
/obj/item/clothing/head/helmet/space/rig,
@@ -15,6 +15,8 @@
)
/obj/item/device/modkit/afterattack(obj/O, mob/user as mob)
if (!target_species)
return //it shouldn't be null, okay?
if(!parts)
user << "<span class='warning'>This kit has no parts for this modification left.</span>"
@@ -22,11 +24,20 @@
del(src)
return
/* TODO: list comparison
if(istype(O,to_type))
user << "<span class='notice'>[O] is already modified.</span>"
var/allowed = 0
for (var/permitted_type in permitted_types)
if(istype(O, permitted_type))
allowed = 1
var/obj/item/clothing/I = O
if (!istype(I) || !allowed)
user << "<span class='notice'>[src] is unable to modify that.</span>"
return
*/
var/excluding = ("exclude" in I.species_restricted)
var/in_list = (target_species in I.species_restricted)
if (excluding ^ in_list)
user << "<span class='notice'>[I] is already modified.</span>"
if(!isturf(O.loc))
user << "<span class='warning'>[O] must be safely placed on the ground for modification.</span>"
@@ -36,22 +47,22 @@
user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].")
var/obj/item/clothing/I = O
if(istype(I))
I.species_restricted = target_species.Copy()
I.refit_for_species(target_species)
parts--
if (istype(I, /obj/item/clothing/head/helmet))
parts &= ~MODKIT_HELMET
if (istype(I, /obj/item/clothing/suit))
parts &= ~MODKIT_SUIT
if(!parts)
user.drop_from_inventory(src)
del(src)
/obj/item/device/modkit/tajaran
name = "tajaran hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajara."
target_species = list("Tajaran")
/obj/item/device/modkit/examine()
..()
usr << "It looks as though it modifies hardsuits to fit the following users:"
for(var/species in target_species)
usr << "- [species]"
usr << "It looks as though it modifies hardsuits to fit [target_species] users."
/obj/item/device/modkit/tajaran
name = "tajaran hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran."
target_species = "Tajaran"
+2 -2
View File
@@ -32,7 +32,7 @@
/obj/item/weapon/kitchen/utensil/New()
if (prob(60))
src.pixel_y = rand(0, 4)
create_reagents(5)
return
@@ -58,7 +58,7 @@
for(var/mob/O in viewers(M, null))
O.show_message(text("\blue [] feeds [] some [] from \the []", user, M, loaded, src), 1)
M.reagents.add_reagent("nutriment", 1)
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
overlays.Cut()
return
+12 -3
View File
@@ -14,7 +14,7 @@ var/global/normal_ooc_colour = "#002eb8"
src << "Guests may not use OOC."
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
msg = trim(copytext(sanitize(msg), 1, MAX_MESSAGE_LEN))
if(!msg) return
if(!(prefs.toggles & CHAT_OOC))
@@ -102,7 +102,7 @@ var/global/normal_ooc_colour = "#002eb8"
src << "Guests may not use OOC."
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
msg = trim(copytext(sanitize(msg), 1, MAX_MESSAGE_LEN))
if(!msg) return
if(!(prefs.toggles & CHAT_LOOC))
@@ -131,9 +131,12 @@ var/global/normal_ooc_colour = "#002eb8"
var/list/heard = get_mobs_in_view(7, src.mob)
var/mob/S = src.mob
var/display_name = S.key
if(S.stat != DEAD)
display_name = S.name
// Handle non-admins
for(var/mob/M in heard)
if(!M.client)
continue
@@ -149,9 +152,15 @@ var/global/normal_ooc_colour = "#002eb8"
else
display_name = holder.fakekey
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
// Now handle admins
display_name = S.key
if(S.stat != DEAD)
display_name = "[S.name]/([S.key])"
for(var/client/C in admins)
if(C.prefs.toggles & CHAT_LOOC)
var/prefix = "(R)LOOC"
if (C.mob in heard)
prefix = "LOOC"
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>[prefix]:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>[prefix]:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
+4
View File
@@ -1,3 +1,4 @@
#ifndef OVERRIDE_BAN_SYSTEM
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key,address,computer_id)
if(ckey(key) in admin_datums)
@@ -79,3 +80,6 @@ world/IsBanned(key,address,computer_id)
if (failedip)
message_admins("[key] has logged in with a blank ip in the ban check.")
return ..() //default pager ban stuff
#endif
#undef OVERRIDE_BAN_SYSTEM
+2 -2
View File
@@ -161,9 +161,9 @@
corpseidaccess = "Station Engineer"
/obj/effect/landmark/corpse/engineer/rig
corpsesuit = /obj/item/clothing/suit/space/rig
corpsesuit = /obj/item/clothing/suit/space/rig/engineering
corpsemask = /obj/item/clothing/mask/breath
corpsehelmet = /obj/item/clothing/head/helmet/space/rig
corpsehelmet = /obj/item/clothing/head/helmet/space/rig/engineering
/obj/effect/landmark/corpse/clown
name = "Clown"
+23
View File
@@ -32,6 +32,29 @@
return 1
/obj/item/clothing/proc/refit_for_species(var/target_species)
switch(target_species)
if("Human", "Skrell") //humanoid bodytypes
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
else
species_restricted = list(target_species)
if (sprite_sheets_obj && (target_species in sprite_sheets_obj))
icon = sprite_sheets_obj[target_species]
/obj/item/clothing/head/helmet/refit_for_species(var/target_species)
switch(target_species)
if("Skrell")
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
if("Human")
species_restricted = list("exclude","Skrell","Unathi","Tajaran","Diona","Vox")
else
species_restricted = list(target_species)
if (sprite_sheets_obj && (target_species in sprite_sheets_obj))
icon = sprite_sheets_obj[target_species]
//Ears: headsets, earmuffs and tiny objects
/obj/item/clothing/ears
name = "ears"
+46 -9
View File
@@ -1,10 +1,10 @@
//Regular rig suits
/obj/item/clothing/head/helmet/space/rig
name = "engineering hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
name = "hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
icon_state = "rig0-engineering"
item_state = "eng_helm"
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
allowed = list(/obj/item/device/flashlight)
var/brightness_on = 4 //luminosity when on
var/on = 0
@@ -49,13 +49,13 @@
SetLuminosity(brightness_on)
/obj/item/clothing/suit/space/rig
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
name = "hardsuit"
desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit."
icon_state = "rig-engineering"
item_state = "eng_hardsuit"
slowdown = 1
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
@@ -292,21 +292,46 @@
..()
//Engineering rig
/obj/item/clothing/head/helmet/space/rig/engineering
name = "engineering hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "rig0-engineering"
item_state = "eng_helm"
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
sprite_sheets_obj = list(
"Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi',
)
/obj/item/clothing/suit/space/rig/engineering
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "rig-engineering"
item_state = "eng_hardsuit"
slowdown = 1
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
sprite_sheets_obj = list(
"Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi',
)
//Chief Engineer's rig
/obj/item/clothing/head/helmet/space/rig/elite
/obj/item/clothing/head/helmet/space/rig/engineering/chief
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "rig0-white"
item_state = "ce_helm"
item_color = "white"
sprite_sheets = null
sprite_sheets_obj = null
/obj/item/clothing/suit/space/rig/elite
/obj/item/clothing/suit/space/rig/engineering/chief
icon_state = "rig-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
sprite_sheets = null
sprite_sheets_obj = null
//Mining rig
/obj/item/clothing/head/helmet/space/rig/mining
@@ -336,6 +361,13 @@
siemens_coefficient = 0.6
var/obj/machinery/camera/camera
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox")
sprite_sheets_obj = list(
"Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi',
"Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
)
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
if(camera)
..(user)
@@ -362,6 +394,11 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
siemens_coefficient = 0.6
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox")
sprite_sheets_obj = list(
"Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi',
"Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi',
)
//Wizard Rig
+14 -14
View File
@@ -72,85 +72,85 @@
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/psyche
name = "psychedelic"
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_color = "psyche"
/obj/item/clothing/under/lightblue
name = "lightblue"
name = "lightblue jumpsuit"
desc = "lightblue"
icon_state = "lightblue"
item_color = "lightblue"
/obj/item/clothing/under/aqua
name = "aqua"
name = "aqua jumpsuit"
desc = "aqua"
icon_state = "aqua"
item_color = "aqua"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/purple
name = "purple"
name = "purple jumpsuit"
desc = "purple"
icon_state = "purple"
item_state = "p_suit"
item_color = "purple"
/obj/item/clothing/under/lightpurple
name = "lightpurple"
name = "lightpurple jumpsuit"
desc = "lightpurple"
icon_state = "lightpurple"
item_color = "lightpurple"
/obj/item/clothing/under/lightgreen
name = "lightgreen"
name = "lightgreen jumpsuit"
desc = "lightgreen"
icon_state = "lightgreen"
item_color = "lightgreen"
/obj/item/clothing/under/lightblue
name = "lightblue"
name = "lightblue jumpsuit"
desc = "lightblue"
icon_state = "lightblue"
item_color = "lightblue"
/obj/item/clothing/under/lightbrown
name = "lightbrown"
name = "lightbrown jumpsuit"
desc = "lightbrown"
icon_state = "lightbrown"
item_color = "lightbrown"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/brown
name = "brown"
name = "brown jumpsuit"
desc = "brown"
icon_state = "brown"
item_color = "brown"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/yellowgreen
name = "yellowgreen"
name = "yellowgreen jumpsuit"
desc = "yellowgreen"
icon_state = "yellowgreen"
item_color = "yellowgreen"
/obj/item/clothing/under/darkblue
name = "darkblue"
name = "darkblue jumpsuit"
desc = "darkblue"
icon_state = "darkblue"
item_color = "darkblue"
flags = FPRINT | TABLEPASS
/obj/item/clothing/under/lightred
name = "lightred"
name = "lightred jumpsuit"
desc = "lightred"
icon_state = "lightred"
item_color = "lightred"
/obj/item/clothing/under/darkred
name = "darkred"
name = "darkred jumpsuit"
desc = "darkred"
icon_state = "darkred"
item_color = "darkred"
flags = FPRINT | TABLEPASS
flags = FPRINT | TABLEPASS
+5 -1
View File
@@ -113,24 +113,28 @@
/obj/item/clothing/under/lawyer/black
name = "black Lawyer suit"
icon_state = "lawyer_black"
item_state = "lawyer_black"
item_color = "lawyer_black"
/obj/item/clothing/under/lawyer/female
name = "black Lawyer suit"
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
item_color = "black_suit_fem"
/obj/item/clothing/under/lawyer/red
name = "red Lawyer suit"
icon_state = "lawyer_red"
item_state = "lawyer_red"
item_color = "lawyer_red"
/obj/item/clothing/under/lawyer/blue
name = "blue Lawyer suit"
icon_state = "lawyer_blue"
item_state = "lawyer_blue"
item_color = "lawyer_blue"
@@ -178,4 +182,4 @@
name = "shaft miner's jumpsuit"
icon_state = "miner"
item_state = "miner"
item_color = "miner"
item_color = "miner"
+6 -1
View File
@@ -6,21 +6,26 @@
body_parts_covered = LOWER_TORSO
/obj/item/clothing/under/shorts/red
name = "red athletic shorts"
icon_state = "redshorts"
item_color = "redshorts"
/obj/item/clothing/under/shorts/green
name = "green athletic shorts"
icon_state = "greenshorts"
item_color = "greenshorts"
/obj/item/clothing/under/shorts/blue
name = "blue athletic shorts"
icon_state = "blueshorts"
item_color = "blueshorts"
/obj/item/clothing/under/shorts/black
name = "black athletic shorts"
icon_state = "blackshorts"
item_color = "blackshorts"
/obj/item/clothing/under/shorts/grey
name = "grey athletic shorts"
icon_state = "greyshorts"
item_color = "greyshorts"
item_color = "greyshorts"
-1
View File
@@ -76,7 +76,6 @@ var/list/event_last_fired = list()
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
if(active_with_role["Security"] > 0)
-44
View File
@@ -1,44 +0,0 @@
datum/event/organ_failure
var/severity = 1
datum/event/organ_failure/setup()
announceWhen = rand(0, 300)
endWhen = announceWhen + 1
severity = rand(1, 3)
datum/event/organ_failure/announce()
command_alert("Confirmed outbreak of level [rand(3,7)] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
world << sound('sound/AI/outbreak5.ogg')
datum/event/organ_failure/start()
var/list/candidates = list() //list of candidate keys
for(var/mob/living/carbon/human/G in player_list)
if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70 && G.internal_organs)
candidates += G
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
while(severity > 0 && candidates.len)
var/mob/living/carbon/human/C = candidates[1]
var/acute = prob(15)
if (prob(75))
//internal organ infection
var/datum/organ/internal/I = pick(C.internal_organs)
if (acute)
I.germ_level = max(INFECTION_LEVEL_TWO, I.germ_level)
else
I.germ_level = max(rand(INFECTION_LEVEL_ONE,INFECTION_LEVEL_ONE*2), I.germ_level)
else
//external organ infection
var/datum/organ/external/O = pick(C.organs)
if (acute)
O.germ_level = max(INFECTION_LEVEL_TWO, O.germ_level)
else
O.germ_level = max(rand(INFECTION_LEVEL_ONE,INFECTION_LEVEL_ONE*2), O.germ_level)
C.bad_external_organs |= O
severity--
+21 -19
View File
@@ -1,24 +1,25 @@
var/list/dreams = list(
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain",
"voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness",
"light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun",
"a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights",
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money",
"the head of personnel","the head of security","a chief engineer","a research director","a chief medical officer",
"the detective","the warden","a member of the internal affairs","a station engineer","the janitor","atmospheric technician",
"the quartermaster","a cargo technician","the botanist","a shaft miner","the psychologist","the chemist","the geneticist",
"the virologist","the roboticist","the chef","the bartender","the chaplain","the librarian","a mouse","an ert member",
"a beach","the holodeck","a smokey room","a voice","the cold","a mouse","an operating table","the bar","the rain","a skrell",
"a unathi","a tajaran","the ai core","the mining station","the research station","a beaker of strange liquid",
)
mob/living/carbon/proc/dream()
dreaming = 1
var/list/dreams = list(
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain",
"voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness",
"light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun",
"a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights",
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money",
"the head of personnel","the head of security","a chief engineer","a research director","a chief medical officer",
"the detective","the warden","a member of the internal affairs","a station engineer","the janitor","atmospheric technician",
"the quartermaster","a cargo technician","the botanist","a shaft miner","the psychologist","the chemist","the geneticist",
"the virologist","the roboticist","the chef","the bartender","the chaplain","the librarian","a mouse","an ert member",
"a beach","the holodeck","a smokey room","a voice","the cold","a mouse","an operating table","the bar","the rain","a skrell",
"a unathi","a tajaran","the ai core","the mining station","the research station","a beaker of strange liquid",
)
spawn(0)
for(var/i = rand(1,4),i > 0, i--)
var/dream_image = pick(dreams)
dreams -= dream_image
src << "\blue <i>... [dream_image] ...</i>"
src << "\blue <i>... [pick(dreams)] ...</i>"
sleep(rand(40,70))
if(paralysis <= 0)
dreaming = 0
@@ -27,6 +28,7 @@ mob/living/carbon/proc/dream()
return 1
mob/living/carbon/proc/handle_dreams()
if(prob(5) && !dreaming) dream()
if(client && !dreaming && prob(5))
dream()
mob/living/carbon/var/dreaming = 0
mob/living/carbon/var/dreaming = 0
+2 -2
View File
@@ -22,7 +22,7 @@ mob/living/carbon/var
mob/living/carbon/proc/handle_hallucinations()
if(handling_hal) return
handling_hal = 1
while(hallucination > 20)
while(client && hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
var/halpick = rand(1,100)
switch(halpick)
@@ -408,4 +408,4 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
target << F.up
*/
F.updateimage()
F.updateimage()
+17 -4
View File
@@ -99,7 +99,8 @@
icon_state = "rock"
return
name = "\improper [mineral.display_name] deposit"
icon_state = "rock_[mineral.name]"
overlays.Cut()
overlays += "rock_[mineral.name]"
//Not even going to touch this pile of spaghetti
@@ -356,7 +357,7 @@
/turf/simulated/mineral/random
name = "Mineral deposit"
var/mineralSpawnChanceList = list("Uranium" = 5, "Iron" = 50, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Phoron" = 25)
var/mineralSpawnChanceList = list("Uranium" = 5, "Platinum" = 5, "Iron" = 35, "Coal" = 35, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Phoron" = 10)
var/mineralChance = 10 //means 10% chance of this plot changing to a mineral deposit
New()
@@ -375,7 +376,7 @@
/turf/simulated/mineral/random/high_chance
mineralChance = 25
mineralSpawnChanceList = list("Uranium" = 10, "Iron" = 30, "Diamond" = 2, "Gold" = 10, "Silver" = 10, "Phoron" = 25)
mineralSpawnChanceList = list("Uranium" = 10, "Platinum" = 10, "Iron" = 20, "Coal" = 20, "Diamond" = 2, "Gold" = 10, "Silver" = 10, "Phoron" = 20)
/**********************Asteroid**************************/
@@ -390,6 +391,7 @@
temperature = T0C
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
var/overlay_detail
has_resources = 1
/turf/simulated/floor/plating/airless/asteroid/New()
@@ -400,7 +402,7 @@
// seedName = pick(list("1","2","3","4"))
// seedAmt = rand(1,4)
if(prob(20))
icon_state = "asteroid[rand(0,12)]"
overlay_detail = "asteroid[rand(0,9)]"
spawn(2)
updateMineralOverlays()
@@ -505,6 +507,17 @@
overlays.Cut()
if(istype(get_step(src, NORTH), /turf/space))
overlays += image('icons/turf/floors.dmi', "asteroid_edge_north")
if(istype(get_step(src, SOUTH), /turf/space))
overlays += image('icons/turf/floors.dmi', "asteroid_edge_south")
if(istype(get_step(src, EAST), /turf/space))
overlays += image('icons/turf/floors.dmi', "asteroid_edge_east")
if(istype(get_step(src, WEST), /turf/space))
overlays += image('icons/turf/floors.dmi', "asteroid_edge_west")
if(overlay_detail) overlays += overlay_detail
if(istype(get_step(src, NORTH), /turf/simulated/mineral))
overlays += image('icons/turf/walls.dmi', "rock_side_n")
if(istype(get_step(src, SOUTH), /turf/simulated/mineral))
+30 -23
View File
@@ -1,6 +1,6 @@
var/list/name_to_mineral
proc/SetupMinerals()
/proc/SetupMinerals()
name_to_mineral = list()
for(var/type in typesof(/mineral) - /mineral)
var/mineral/new_mineral = new type
@@ -9,56 +9,63 @@ proc/SetupMinerals()
name_to_mineral[new_mineral.name] = new_mineral
return 1
mineral
///What am I called?
var/name
var/display_name
///How much ore?
var/result_amount
///Does this type of deposit spread?
var/spread = 1
///Chance of spreading in any direction
var/spread_chance
/mineral
var/name // Tag for use in overlay generation/list population .
var/display_name // What am I called?
var/result_amount // How much ore?
var/spread = 1 // Does this type of deposit spread?
var/spread_chance // Chance of spreading in any direction
var/ore // Path to the ore produced when tile is mined.
///Path to the resultant ore.
var/ore
New()
. = ..()
if(!display_name)
display_name = name
/mineral/New()
. = ..()
if(!display_name)
display_name = name
mineral/uranium
/mineral/uranium
name = "Uranium"
result_amount = 5
spread_chance = 10
ore = /obj/item/weapon/ore/uranium
mineral/iron
/mineral/platinum
name = "Platinum"
result_amount = 5
spread_chance = 10
ore = /obj/item/weapon/ore/osmium
/mineral/iron
name = "Iron"
result_amount = 5
spread_chance = 25
ore = /obj/item/weapon/ore/iron
mineral/diamond
/mineral/coal
name = "Coal"
result_amount = 5
spread_chance = 25
ore = /obj/item/weapon/ore/coal
/mineral/diamond
name = "Diamond"
result_amount = 5
spread_chance = 10
ore = /obj/item/weapon/ore/diamond
mineral/gold
/mineral/gold
name = "Gold"
result_amount = 5
spread_chance = 10
ore = /obj/item/weapon/ore/gold
mineral/silver
/mineral/silver
name = "Silver"
result_amount = 5
spread_chance = 10
ore = /obj/item/weapon/ore/silver
mineral/phoron
/mineral/phoron
name = "Phoron"
result_amount = 5
spread_chance = 25
+3 -3
View File
@@ -19,7 +19,7 @@
/obj/item/weapon/ore/coal
name = "carbonaceous rock"
icon_state = "Iron ore" //TODO
icon_state = "Coal ore"
origin_tech = "materials=1"
oretag = "coal"
@@ -55,12 +55,12 @@
/obj/item/weapon/ore/osmium
name = "raw platinum"
icon_state = "slag" //TODO
icon_state = "Platinum ore"
oretag = "platinum"
/obj/item/weapon/ore/hydrogen
name = "raw hydrogen"
icon_state = "slag" //TODO
icon_state = "Phazon"
oretag = "hydrogen"
/obj/item/weapon/ore/slag
+2 -1
View File
@@ -24,7 +24,8 @@
oretag = "sand"
/datum/ore/phoron
smelts_to = /obj/item/stack/sheet/mineral/phoron
//smelts_to = something that explodes violently on the conveyor, huhuhuhu
compresses_to = /obj/item/stack/sheet/mineral/phoron
oretag = "phoron"
/datum/ore/silver
Regular → Executable
+3 -3
View File
@@ -54,7 +54,7 @@
speech_verb = "shrieks"
colour = "vox"
key = "v"
flags = RESTRICTED | UNTRANSLATABLE
flags = RESTRICTED
/datum/language/diona
name = "Rootspeak"
@@ -62,7 +62,7 @@
speech_verb = "creaks and rustles"
colour = "soghun"
key = "q"
flags = RESTRICTED | UNTRANSLATABLE
flags = RESTRICTED
/datum/language/human
name = "Sol Common"
@@ -106,7 +106,7 @@
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking)
return ((universal_speak && !(speaking.flags & UNTRANSLATABLE)) || speaking in src.languages)
return (universal_speak || speaking in src.languages)
//TBD
/mob/verb/check_languages()
+10 -16
View File
@@ -423,23 +423,17 @@
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.controlling)
if(B && B.host_brain)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
B.host_brain << "\red <B>Your vision swims as the alien parasite releases control of your body.</B>"
B.ckey = ckey
B.controlling = 0
if(B.host_brain.ckey)
ckey = B.host_brain.ckey
B.host_brain.ckey = null
B.host_brain.name = "host brain"
B.host_brain.real_name = "host brain"
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
else
src << "\red <B>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</B>"
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
@@ -486,4 +480,4 @@
else
src << "You do not have enough chemicals stored to reproduce."
return
return
+1 -7
View File
@@ -486,14 +486,8 @@
B.host.adjustBrainLoss(rand(5,10))
H << "\red <B>With an immense exertion of will, you regain control of your body!</B>"
B.host << "\red <B>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</b>"
B.controlling = 0
B.ckey = B.host.ckey
B.host.ckey = H.ckey
H.ckey = null
H.name = "host brain"
H.real_name = "host brain"
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
@@ -128,6 +128,9 @@ var/datum/cameranet/cameranet = new()
// 0xf = 15
var/turf/position = get_turf(target)
return checkTurfVis(position)
/datum/cameranet/proc/checkTurfVis(var/turf/position)
var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z)
if(chunk)
if(chunk.changed)
@@ -136,7 +139,6 @@ var/datum/cameranet/cameranet = new()
return 1
return 0
// Debug verb for VVing the chunk that the turf is in.
/*
/turf/verb/view_chunk()
@@ -51,6 +51,12 @@
var/obj/machinery/hologram/holopad/H = ai.current
H.move_hologram()
/mob/aiEye/proc/getLoc()
if(ai)
if(!isturf(ai.loc) || !ai.client)
return
return ai.eyeobj.loc
// AI MOVEMENT
+2
View File
@@ -65,6 +65,8 @@
var/obj/item/radio/integrated/signal/sradio // AI's signaller
var/translator_on = 0 // keeps track of the translator module
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
+27 -3
View File
@@ -266,7 +266,7 @@
src.medHUD = !src.medHUD
if("translator")
if(href_list["toggle"])
src.universal_speak = !src.universal_speak
src.translator_toggle()
if("doorjack")
if(href_list["jack"])
if(src.cable && src.cable.machine)
@@ -325,7 +325,7 @@
if(s == "medical HUD") //This file has to be saved as ANSI or this will not display correctly
dat += "<a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Medical Analysis Suite</a> [(src.medHUD) ? "<font color=#55FF55>•</font>" : "<font color=#FF5555>•</font>"] <br>"
if(s == "universal translator") //This file has to be saved as ANSI or this will not display correctly
dat += "<a href='byond://?src=\ref[src];software=translator;sub=0'>Universal Translator</a> [(src.universal_speak) ? "<font color=#55FF55>•</font>" : "<font color=#FF5555>•</font>"] <br>"
dat += "<a href='byond://?src=\ref[src];software=translator;sub=0'>Universal Translator</a> [(src.translator_on) ? "<font color=#55FF55>•</font>" : "<font color=#FF5555>•</font>"] <br>"
if(s == "projection array")
dat += "<a href='byond://?src=\ref[src];software=projectionarray;sub=0'>Projection Array</a> <br>"
if(s == "camera jack")
@@ -498,7 +498,7 @@
/mob/living/silicon/pai/proc/softwareTranslator()
var/dat = {"<h2>Universal Translator</h2><hr>
When enabled, this device will automatically convert all spoken and written languages into a format that any known recipient can understand.<br><br>
The device is currently [ (src.universal_speak) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled</font>.<br>
The device is currently [ (src.translator_on) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled</font>.<br>
<a href='byond://?src=\ref[src];software=translator;sub=0;toggle=1'>Toggle Device</a><br>
"}
return dat
@@ -694,3 +694,27 @@
dat += addtext("<tr><td class='a'><i><b>From</b></i></td><td class='a'><i><b>&rarr;</b></i></td><td><i><b><a href='byond://?src=\ref[src];software=pdamessage;target=",index["target"],"'>", index["owner"],"</a>: </b></i>", index["message"], "<br></td></tr>")
dat += "</table>"
return dat
/mob/living/silicon/pai/proc/translator_toggle()
// Sol Common, Tradeband and Gutter are added with New() and are therefore the current default, always active languages
if(translator_on)
translator_on = 0
remove_language("Sinta'unathi")
remove_language("Siik'maas")
remove_language("Siik'tajr")
remove_language("Skrellian")
src << "\blue Translator Module toggled OFF."
else
translator_on = 1
add_language("Sinta'unathi")
add_language("Siik'maas")
add_language("Siik'tajr", 0)
add_language("Skrellian")
src << "\blue Translator Module toggled ON."
+66 -12
View File
@@ -31,7 +31,7 @@
desc = "A small, quivering sluglike creature."
speak_emote = list("chirrups")
emote_hear = list("chirrups")
response_help = "pokes the"
response_help = "pokes"
response_disarm = "prods the"
response_harm = "stomps on the"
icon_state = "brainslug"
@@ -234,14 +234,45 @@
src << "\red <B>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</B>"
host << "\red <B>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</B>"
// host -> brain
var/h2b_id = host.computer_id
var/h2b_ip= host.lastKnownIP
host.computer_id = null
host.lastKnownIP = null
del(host_brain)
host_brain = new(src)
host_brain.ckey = host.ckey
if(!host_brain.computer_id)
host_brain.computer_id = h2b_id
if(!host_brain.lastKnownIP)
host_brain.lastKnownIP = h2b_ip
// self -> host
var/s2h_id = src.computer_id
var/s2h_ip= src.lastKnownIP
src.computer_id = null
src.lastKnownIP = null
host.ckey = src.ckey
if(!host.computer_id)
host.computer_id = s2h_id
if(!host.lastKnownIP)
host.lastKnownIP = s2h_ip
controlling = 1
host.verbs += /mob/living/carbon/proc/release_control
host.verbs += /mob/living/carbon/proc/punish_host
host.verbs += /mob/living/carbon/proc/spawn_larvae
return
/mob/living/simple_animal/borer/verb/secrete_chemicals()
set category = "Alien"
set name = "Secrete Chemicals"
@@ -329,20 +360,45 @@ mob/living/simple_animal/borer/proc/detatch()
host.verbs -= /mob/living/carbon/proc/punish_host
host.verbs -= /mob/living/carbon/proc/spawn_larvae
if(host_brain.ckey)
if(host_brain && host_brain.ckey)
// host -> self
var/h2s_id = host.computer_id
var/h2s_ip= host.lastKnownIP
host.computer_id = null
host.lastKnownIP = null
src.ckey = host.ckey
if(!src.computer_id)
src.computer_id = h2s_id
if(!host_brain.lastKnownIP)
src.lastKnownIP = h2s_ip
// brain -> host
var/b2h_id = host_brain.computer_id
var/b2h_ip= host_brain.lastKnownIP
host_brain.computer_id = null
host_brain.lastKnownIP = null
host.ckey = host_brain.ckey
host_brain.ckey = null
host_brain.name = "host brain"
host_brain.real_name = "host brain"
if(!host.computer_id)
host.computer_id = b2h_id
if(!host.lastKnownIP)
host.lastKnownIP = b2h_ip
del(host_brain)
var/mob/living/H = host
H.status_flags &= ~PASSEMOTES
host = null
for(var/atom/A in H.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
H.status_flags &= ~PASSEMOTES
return
/mob/living/simple_animal/borer/verb/infest()
set category = "Alien"
@@ -408,8 +464,6 @@ mob/living/simple_animal/borer/proc/detatch()
var/datum/organ/external/head = H.get_organ("head")
head.implants += src
host_brain.name = M.name
host_brain.real_name = M.real_name
host.status_flags |= PASSEMOTES
return
@@ -503,4 +557,4 @@ mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
src.mind = candidate.mob.mind
src.ckey = candidate.ckey
if(src.mind)
src.mind.assigned_role = "Cortical Borer"
src.mind.assigned_role = "Cortical Borer"
@@ -318,7 +318,7 @@
var/list/items = list()
for(var/obj/item/I in view(1,src))
if(I.loc != src && I.w_class <= 2)
if(I.loc != src && I.w_class <= 2 && I.Adjacent(src) )
items.Add(I)
var/obj/selection = input("Select an item.", "Pickup") in items
@@ -141,48 +141,42 @@
//Atmos
var/atmos_suitable = 1
var/atom/A = src.loc
if(isturf(A))
var/turf/T = A
var/areatemp = T.temperature
if( abs(areatemp - bodytemperature) > 40 )
var/diff = areatemp - bodytemperature
diff = diff / 5
//world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]"
bodytemperature += diff
var/atom/A = src.loc
if(istype(T,/turf/simulated))
var/turf/simulated/ST = T
if(ST.air)
var/tox = ST.air.phoron
var/oxy = ST.air.oxygen
var/n2 = ST.air.nitrogen
var/co2 = ST.air.carbon_dioxide
if(min_oxy)
if(oxy < min_oxy)
atmos_suitable = 0
if(max_oxy)
if(oxy > max_oxy)
atmos_suitable = 0
if(min_tox)
if(tox < min_tox)
atmos_suitable = 0
if(max_tox)
if(tox > max_tox)
atmos_suitable = 0
if(min_n2)
if(n2 < min_n2)
atmos_suitable = 0
if(max_n2)
if(n2 > max_n2)
atmos_suitable = 0
if(min_co2)
if(co2 < min_co2)
atmos_suitable = 0
if(max_co2)
if(co2 > max_co2)
atmos_suitable = 0
if(istype(A,/turf))
var/turf/T = A
var/datum/gas_mixture/Environment = T.return_air()
if(Environment)
if( abs(Environment.temperature - bodytemperature) > 40 )
bodytemperature += ((Environment.temperature - bodytemperature) / 5)
if(min_oxy)
if(Environment.oxygen < min_oxy)
atmos_suitable = 0
if(max_oxy)
if(Environment.oxygen > max_oxy)
atmos_suitable = 0
if(min_tox)
if(Environment.phoron < min_tox)
atmos_suitable = 0
if(max_tox)
if(Environment.phoron > max_tox)
atmos_suitable = 0
if(min_n2)
if(Environment.nitrogen < min_n2)
atmos_suitable = 0
if(max_n2)
if(Environment.nitrogen > max_n2)
atmos_suitable = 0
if(min_co2)
if(Environment.carbon_dioxide < min_co2)
atmos_suitable = 0
if(max_co2)
if(Environment.carbon_dioxide > max_co2)
atmos_suitable = 0
//Atmos effect
if(bodytemperature < minbodytemp)
+1 -1
View File
@@ -721,7 +721,7 @@ note dizziness decrements automatically in the mob's Life() proc.
stat(null,"MasterController-ERROR")
if(listed_turf && client)
if(get_dist(listed_turf,src) > 1)
if(!TurfAdjacent(listed_turf))
listed_turf = null
else
statpanel(listed_turf.name, null, listed_turf)
+1 -1
View File
@@ -74,7 +74,7 @@
return 1
//Universal speak makes everything understandable, for obvious reasons.
else if((src.universal_speak || src.universal_understand) && !(speaking.flags & UNTRANSLATABLE))
else if(src.universal_speak || src.universal_understand)
return 1
//Languages are handled after.
+3
View File
@@ -127,6 +127,9 @@
O.verbs += /mob/living/silicon/ai/proc/ai_camera_list
O.verbs += /mob/living/silicon/ai/proc/ai_statuschange
O.verbs += /mob/living/silicon/ai/proc/ai_roster
O.verbs += /mob/living/silicon/ai/proc/ai_store_location
O.verbs += /mob/living/silicon/ai/proc/ai_goto_location
O.verbs += /mob/living/silicon/ai/proc/ai_remove_location
O.job = "AI"
@@ -21,6 +21,10 @@
/obj/item/projectile/bullet/weakbullet/beanbag //because beanbags are not bullets
name = "beanbag"
damage = 20
agony = 60
embed = 0
sharp = 0
/obj/item/projectile/bullet/weakbullet/rubber
name = "rubber bullet"
@@ -17,7 +17,7 @@
var/fillevel = gulp_size
if(!R.total_volume || !R)
user << "\red None of [src] left, oh no!"
user << "\red The [src.name] is empty!"
return 0
if(M == user)
@@ -24,7 +24,7 @@
var/datum/reagents/R = src.reagents
if(!R || !R.total_volume)
user << "\red None of [src] left, oh no!"
user << "\red The [src.name] is empty!"
return 0
if(M == user)
@@ -23,7 +23,7 @@
var/fillevel = gulp_size
if(!R.total_volume || !R)
user << "\red None of [src] left, oh no!"
user << "\red The [src.name] is empty!"
return 0
if(M == user)
-1
View File
@@ -753,7 +753,6 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight
#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand.
#define UNTRANSLATABLE 16 // Language is not translated by universal_speak or universal_understand.
//Flags for zone sleeping
#define ZONE_ACTIVE 1
+12
View File
@@ -113,6 +113,18 @@ should be listed in the changelog upon commit though. Thanks. -->
<!-- DO NOT REMOVE, MOVE, OR COPY THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# -->
<div class='commit sansserif'>
<h2 class='date'>20 July 2014</h2>
<h3 class='author'>PsiOmegaDelta updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>AI can now store up to five camera locations and return to them when desired.</li>
<li class='rscadd'>AI can now alt+left click turfs in camera view to list and interact with the objects.</li>
<li class='rscadd'>AI can now ctrl+click turret controls to enable/disable turrets.</li>
<li class='rscadd'>AI can now alt+click turret controls to toggle stun/lethal mode.</li>
<li class='rscadd'>AI can now select which channel to state laws on.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>1 July 2014</h2>
<h3 class='author'>Mloc updated:</h3>
Binary file not shown.

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 863 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 136 KiB

+824 -813
View File
File diff suppressed because it is too large Load Diff