Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into lavaland_megafauna

# Conflicts:
#	code/modules/mob/mob_helpers.dm
#	icons/obj/ammo.dmi
#	icons/obj/guns/projectile.dmi
#	icons/obj/storage.dmi
This commit is contained in:
Markolie
2017-01-31 17:44:38 +01:00
48 changed files with 717 additions and 227 deletions
+1
View File
@@ -274,6 +274,7 @@ CREATE TABLE `player` (
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
`windowflashing` smallint(4) DEFAULT '1',
`exp` mediumtext,
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
+1
View File
@@ -273,6 +273,7 @@ CREATE TABLE `SS13_player` (
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
`windowflashing` smallint(4) DEFAULT '1',
`exp` mediumtext,
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
+2 -1
View File
@@ -32,7 +32,8 @@
#define slot_r_ear 20
#define slot_wear_pda 21
#define slot_tie 22
#define slots_amt 22
#define slot_collar 23
#define slots_amt 23
//Cant seem to find a mob bitflags area other than the powers one
+12 -2
View File
@@ -418,7 +418,7 @@
/proc/SecondsToTicks(var/seconds)
return seconds * 10
proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, var/poll_time = 300, var/ignore_respawnability = 0, var/min_hours = 0)
proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE)
var/roletext = be_special_type ? get_roletext(be_special_type) : null
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
@@ -444,7 +444,8 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
continue
spawn(0)
G << 'sound/misc/notice2.ogg'//Alerting them to their consideration
if(flashwindow)
window_flash(G.client)
switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Not This Round"))
if("Yes")
to_chat(G, "<span class='notice'>Choice registered: Yes.</span>")
@@ -471,3 +472,12 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
candidates.Remove(G)
return candidates
/proc/window_flash(client/C)
if(ismob(C))
var/mob/M = C
if(M.client)
C = M.client
if(!C || !C.prefs.windowflashing)
return
winset(C, "mainwindow", "flash=5")
+2 -2
View File
@@ -95,9 +95,9 @@
update_inv_r_hand(0)
return
// operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src)
// operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper)
var/sdepth = A.storage_depth(src)
if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1))
if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 2))
// No adjacency needed
if(W)
var/resolved = A.attackby(W,src)
+4 -4
View File
@@ -4,16 +4,16 @@
Otherwise pretty standard.
*/
/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity)
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
/mob/living/carbon/human/UnarmedAttack(atom/A, proximity)
// Special glove functions:
// If the gloves do anything, have them return 1 to stop
// normal attack_hand() here.
if(proximity && istype(G) && G.Touch(A,1))
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
if(proximity && istype(G) && G.Touch(A, 1))
return
A.attack_hand(src)
/atom/proc/attack_hand(mob/user as mob)
return
@@ -58,7 +58,6 @@
// if(!traitors.len)
// return 0
..()
return 1
@@ -197,5 +196,3 @@
//message_admins("New traitor roll failed. No new traitor.")
//else
//message_admins("Late Joiner does not have Be Syndicate")
+5 -1
View File
@@ -12,7 +12,11 @@
return
/obj/effect/rune/proc/check_icon()
icon = get_rune_cult(invocation)
if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way
var/bits = make_bit_triplet()
icon = get_rune(bits)
else
icon = get_rune_cult(invocation)
/obj/item/weapon/tome
name = "arcane tome"
+2
View File
@@ -439,3 +439,5 @@ var/time_last_changed_position = 0
name = "\improper CentComm identification computer"
circuit = /obj/item/weapon/circuitboard/card/centcom
req_access = list(access_cent_commander)
change_position_cooldown = -1
blacklisted = list()
+44 -3
View File
@@ -8,14 +8,16 @@
//Request Console Screens
#define RCS_MAINMENU 0 // Main menu
#define RCS_RQASSIST 1 // Request supplies
#define RCS_RQSUPPLY 2 // Request assistance
#define RCS_RQSUPPLY 1 // Request supplies
#define RCS_RQASSIST 2 // Request assistance
#define RCS_SENDINFO 3 // Relay information
#define RCS_SENTPASS 4 // Message sent successfully
#define RCS_SENTFAIL 5 // Message sent unsuccessfully
#define RCS_VIEWMSGS 6 // View messages
#define RCS_MESSAUTH 7 // Authentication before sending
#define RCS_ANNOUNCE 8 // Send announcement
#define RCS_SHIPPING 9 // Print Shipping Labels/Packages
#define RCS_SHIP_LOG 10 // View Shipping Label Log
var/req_console_assistance = list()
var/req_console_supplies = list()
@@ -52,6 +54,10 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/priority = -1 ; //Priority of the message being sent
light_range = 0
var/datum/announcement/announcement = new
var/list/shipping_log = list()
var/ship_tag_name = ""
var/ship_tag_index = 0
var/print_cooldown = 0 //cooldown on shipping label printer, stores the in-game time of when the printer will next be ready
/obj/machinery/requests_console/power_change()
..()
@@ -128,6 +134,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["assist_dept"] = req_console_assistance
data["supply_dept"] = req_console_supplies
data["info_dept"] = req_console_information
data["ship_dept"] = TAGGERLOCATIONS
data["message"] = message
data["recipient"] = recipient
@@ -135,6 +142,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["msgStamped"] = msgStamped
data["msgVerified"] = msgVerified
data["announceAuth"] = announceAuth
data["shipDest"] = ship_tag_name
data["shipping_log"] = shipping_log
return data
@@ -182,7 +191,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
screen = RCS_SENTPASS
message_log += "<B>Message sent to [recipient]</B><BR>[message]"
else
audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
audible_message(text("[bicon(src)] *The Requests Console beeps: '<b>NOTICE:</b> No server detected!'"),,4)
//Handle screen switching
if(href_list["setScreen"])
@@ -199,6 +208,26 @@ var/list/obj/machinery/requests_console/allConsoles = list()
reset_message()
screen = tempScreen
if(href_list["shipSelect"])
ship_tag_name = href_list["shipSelect"]
ship_tag_index = TAGGERLOCATIONS.Find(ship_tag_name)
//Handle Shipping Label Printing
if(href_list["printLabel"])
var/error_message = ""
if(!ship_tag_index)
error_message = "Please select a destination."
else if(!msgVerified)
error_message = "Please verify shipper ID."
else if(world.time < print_cooldown)
error_message = "Please allow the printer time to prepare the next shipping label."
if(error_message)
audible_message(text("[bicon(src)] *The Requests Console beeps: '<b>NOTICE:</b> [error_message]'"),,4)
return
print_label(ship_tag_name, ship_tag_index)
shipping_log += "<B>Shipping Label printed for [ship_tag_name]</b><br>[msgVerified]"
reset_message(1)
//Handle silencing the console
if(href_list["toggleSilent"])
silent = !silent
@@ -245,6 +274,10 @@ var/list/obj/machinery/requests_console/allConsoles = list()
reset_message()
to_chat(user, "<span class='warning'>You are not authorized to send announcements.</span>")
updateUsrDialog()
if(screen == RCS_SHIPPING)
var/obj/item/weapon/card/id/T = O
msgVerified = text("<font color='green'><b>Sender verified as [T.registered_name] ([T.assignment])</b></font>")
updateUsrDialog()
if(istype(O, /obj/item/weapon/stamp))
if(inoperable(MAINT)) return
if(screen == RCS_MESSAUTH)
@@ -261,6 +294,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
msgStamped = ""
announceAuth = 0
announcement.announcer = ""
ship_tag_name = ""
ship_tag_index = 0
if(mainmenu)
screen = RCS_MAINMENU
@@ -286,3 +321,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
else // Normal
src.message_log += "<b>From:</b> [linkedSender]<BR>[message]"
set_light(2)
/obj/machinery/requests_console/proc/print_label(tag_name, tag_index)
var/obj/item/shippingPackage/sp = new /obj/item/shippingPackage(get_turf(src))
sp.sortTag = tag_index
sp.update_desc()
print_cooldown = world.time + 600 //1 minute cooldown before you can print another label, but you can still configure the next one during this time
+2
View File
@@ -424,6 +424,7 @@
else if(ghost)
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
@@ -546,6 +547,7 @@
else if(ghost)
user.visible_message("<span class='notice'>[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='warning'>[user] buzzes: Resuscitation failed.</span>")
+16
View File
@@ -57,3 +57,19 @@
return
else
to_chat(user, "<span class='danger'>FĆAL RrR</span>: ŧer nt recgnized, c-cntr-r䣧-ç äcked.")
/obj/structure/respawner
name = "\improper Long-Distance Cloning Machine"
desc = "Top-of-the-line Nanotrasen technology allows for cloning of crew members from off-station upon bluespace request."
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "borgcharger1(old)"
anchored = 1
density = 1
/obj/structure/respawner/attack_ghost(mob/dead/observer/user as mob)
var/response = alert(user, "Are you sure you want to spawn like this?\n(If you do this, you won't be able to be cloned!)","Respawn?","Yes","No")
if(response == "Yes")
user.forceMove(get_turf(src))
log_admin("[key_name(user)] was incarnated by a respawner machine.")
message_admins("[key_name_admin(user)] was incarnated by a respawner machine.")
user.incarnate_ghost()
+4 -1
View File
@@ -393,8 +393,11 @@
logout_status = " <i>(snpc)</i>"
else
logout_status = M.client ? "" : " <i>(logged out)</i>"
var/dname = M.real_name
if(!dname)
dname = M
return {"<tr><td><a href='?src=[UID()];adminplayeropts=\ref[M]'>[M.real_name]</a><b>[caption]</b>[logout_status][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>
return {"<tr><td><a href='?src=[UID()];adminplayeropts=\ref[M]'>[dname]</a><b>[caption]</b>[logout_status][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>
<td><A href='?src=[usr.UID()];priv_msg=\ref[M]'>PM</A></td>[close ? "</tr>" : ""]"}
/datum/admins/proc/check_antagonists()
+1
View File
@@ -119,6 +119,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
for(var/client/X in modholders + adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
window_flash(X)
to_chat(X, msg)
//show it to the person adminhelping too
+1
View File
@@ -133,6 +133,7 @@
if(holder && !C.holder)
recieve_message = "<span class='[recieve_span]' size='3'>-- Click the [recieve_pm_type]'s name to reply --</span>\n"
if(C.adminhelped)
window_flash(C)
to_chat(C, recieve_message)
C.adminhelped = 0
@@ -93,6 +93,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/show_ghostitem_attack = TRUE
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/windowflashing = TRUE
//character preferences
@@ -418,6 +419,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<h2>General Settings</h2>"
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
dat += "<b>Ghost-Item Attack Animation:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
dat += "<b>Custom UI settings:</b><br>"
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'<tr><td>__</td></tr></table><br>"
@@ -1935,6 +1937,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("ghost_att_anim")
show_ghostitem_attack = !show_ghostitem_attack
if("winflash")
windowflashing = !windowflashing
if("UIcolor")
var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
if(!UI_style_color_new) return
@@ -14,7 +14,8 @@
nanoui_fancy,
show_ghostitem_attack,
lastchangelog,
exp
exp,
windowflashing
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -42,6 +43,7 @@
show_ghostitem_attack = text2num(query.item[12])
lastchangelog = query.item[13]
exp = query.item[14]
windowflashing = text2num(query.item[15])
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -57,6 +59,7 @@
show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack))
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
exp = sanitize_text(exp, initial(exp))
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
return 1
/datum/preferences/proc/save_preferences(client/C)
+3 -2
View File
@@ -193,8 +193,9 @@ BLIND // can't see anything
"Drask" = 'icons/mob/species/drask/gloves.dmi'
)
/obj/item/clothing/gloves/proc/Touch()
return
// Called just before an attack_hand(), in mob/UnarmedAttack()
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
return 0 // return 1 to cancel attack_hand()
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wirecutters))
@@ -56,3 +56,74 @@
icon_state = "latex"
item_state = "lgloves"
flags = NODROP
/obj/item/clothing/gloves/color/yellow/stun
name = "stun gloves"
desc = "Horrendous and awful. It smells like cancer. The fact it has wires attached to it is incidental."
var/obj/item/weapon/stock_parts/cell/cell = null
var/stun_strength = 5
var/stun_cost = 3750
/obj/item/clothing/gloves/color/yellow/stun/New()
..()
update_icon()
/obj/item/clothing/gloves/color/yellow/stun/Destroy()
if(cell)
qdel(cell)
cell = null
return ..()
/obj/item/clothing/gloves/color/yellow/stun/Touch(atom/A, proximity)
if(!ishuman(loc))
return FALSE //Only works while worn
if(!iscarbon(A))
return FALSE
if(!proximity)
return FALSE
if(cell)
var/mob/living/carbon/human/H = loc
if(H.a_intent == I_HARM)
var/mob/living/carbon/C = A
if(cell.use(stun_cost))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 0, loc)
s.start()
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
H.do_attack_animation(C)
visible_message("<span class='danger'>[C] has been touched with [src] by [H]!</span>")
C.Stun(stun_strength)
C.Weaken(stun_strength)
C.apply_effect(STUTTER, stun_strength)
else
to_chat(H, "<span class='notice'>Not enough charge!</span>")
return TRUE
return FALSE
/obj/item/clothing/gloves/color/yellow/stun/update_icon()
..()
overlays.Cut()
overlays += "gloves_wire"
if(cell)
overlays += "gloves_cell"
/obj/item/clothing/gloves/color/yellow/stun/attackby(obj/item/weapon/W, mob/living/user, params)
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(!cell)
if(!user.drop_item())
to_chat(user, "<span class='warning'>[W] is stuck to you!</span>")
return
W.forceMove(src)
cell = W
to_chat(user, "<span class='notice'>You attach [W] to [src].</span>")
update_icon()
else
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
else if(iswirecutter(W))
if(cell)
to_chat(user, "<span class='notice'>You cut [cell] away from [src].</span>")
cell.forceMove(get_turf(loc))
cell = null
update_icon()
+1 -1
View File
@@ -340,7 +340,7 @@
icon_override = 'icons/goonstation/mob/clothing/mask.dmi'
lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
flags = NODROP
flags = NODROP | AIRTIGHT | MASKCOVERSMOUTH
/obj/item/clothing/mask/cursedclown/equipped(mob/user, slot)
..()
+2
View File
@@ -29,6 +29,8 @@
respawnable_list -= C.client
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
new_xeno.key = C.key
if(ticker && ticker.mode)
ticker.mode.xenos += new_xeno.mind
spawncount--
successSpawn = 1
+4 -7
View File
@@ -1,7 +1,7 @@
/*
===============================================================================
How Garbage Collection Works
How Garbage Collection Works
===============================================================================
In BYOND, there are exactly two ways anything gets deleted:
@@ -31,8 +31,8 @@ that can't be. There are two main procs involved in this process:
/proc/qdel(datumToDelete)
This is, effectively, a replacement for del that tells an object to prepare itself to be soft deleted by calling its
Destroy() proc. Depending on the qdel hint returned by Destroy(), qdel will queue the object in the garbage collector
(to be hard deleted if it isn't soft deleted), directly delete the object, pool the object, or ignore the object and
assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
(to be hard deleted if it isn't soft deleted), directly delete the object, or ignore the object and
assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
isnull(gcDestroyed) will be true if an object is not being destroyed, and false if it is (which means you should get
rid of the reference you have to it).
@@ -50,7 +50,7 @@ that can't be. There are two main procs involved in this process:
should use a Del proc for any necessary cleanup, as a Destroy proc on them will not automatically get called.
When called by qdel, Destroy is expected to return a qdel hint, which determines whether the object should be directly
deleted, queued for deletion, pooled, or ignored entirely; which of these are appropriate will vary, though objects
deleted, queued for deletion, or ignored entirely; which of these are appropriate will vary, though objects
should be pooled or queued whenever possible. The full list of qdel hints are in the code for the qdel proc.
As mentioned above, gcDestroyed can be used to tell whether an object is being destroyed. This is important, because if
@@ -62,7 +62,4 @@ reference immediately.
The inner workings of the GC itself and the stuff related to testing it probably don't need a detailed description - if
you intend to work with them, it would be best to read the code to understand what they do.
Pooling is related to GC, in that it's meant to reduce deletion overhead, but it does so by re-using objects instead of
deleting them at all. Explaining pooling is outside the scope of this file.
*/
@@ -10,6 +10,7 @@
/mob/living/carbon/brain/New()
create_reagents(330)
add_language("Galactic Common")
..()
/mob/living/carbon/brain/Destroy()
@@ -788,6 +788,7 @@ Pass a positive integer as an argument to override a bot's default speed.
frustration = 0
/mob/living/simple_animal/bot/show_inv()
return
/mob/living/simple_animal/bot/proc/show_controls(mob/M)
users |= M
@@ -58,7 +58,7 @@
dat += "<tr><td><B>Back:</B></td><td><A href='?src=[UID()];[inventory_back?"remove_inv":"add_inv"]=back'>[(inventory_back && !(inventory_back.flags&ABSTRACT)) ? inventory_back : "<font color=grey>Empty</font>"]</A></td></tr>"
if(can_collar)
dat += "<tr><td>&nbsp;</td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];item=[slot_collar]'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += {"</table>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
@@ -582,21 +582,7 @@
density = initial(density)
update_canmove()
/mob/living/simple_animal/show_inv(mob/user as mob)
user.set_machine(src)
var/dat = {"<table>
<tr><td><B>Left Hand:</B></td><td><A href='?src=[UID()];item=[slot_l_hand]'>[(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "<font color=grey>Empty</font>"]</A></td></tr>
<tr><td><B>Right Hand:</B></td><td><A href='?src=[UID()];item=[slot_r_hand]'>[(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "<font color=grey>Empty</font>"]</A></td></tr>
<tr><td>&nbsp;</td></tr>"}
if(can_collar)
dat += "<tr><td><B>Collar:</B></td><td><A href='?src=[UID()];[collar?"remove_inv":"add_inv"]=collar'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += {"</table>
<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250)
popup.set_content(dat)
popup.open()
/mob/living/simple_animal/proc/make_babies() // <3 <3 <3
if(gender != FEMALE || stat || !scan_ready || !childtype || !simplespecies)
@@ -655,57 +641,74 @@
if(changed)
animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
/mob/living/simple_animal/Topic(href, href_list)
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
if(href_list["remove_inv"])
if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
if("collar")
if(!can_collar)
return
if(collar)
if(collar.flags & NODROP)
to_chat(usr, "<span class='warning'>\The [collar] is stuck too hard to [src] for you to remove!</span>")
return
collar.dropped(src)
collar.forceMove(src.loc)
collar = null
regenerate_icons()
else
to_chat(usr, "<span class='danger'>There is nothing to remove from its [remove_from].</span>")
return
show_inv(usr)
else if(href_list["add_inv"])
if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr)))
return
/* Inventory */
var/add_to = href_list["add_inv"]
switch(add_to)
if("collar")
if(!can_collar || collar)
return
var/obj/item/clothing/accessory/petcollar/C = usr.get_active_hand()
if(!istype(C))
usr.visible_message("[usr] rubs [src]'s neck.","<span class='notice'>You rub [src]'s neck for a moment.</span>")
return
usr.drop_item()
C.forceMove(src)
collar = C
collar.equipped(src)
regenerate_icons()
to_chat(usr, "<span class='notice'>You put \the [C] around \the [src]'s neck.</span>")
if(C.tagname)
name = C.tagname
real_name = C.tagname
show_inv(usr)
/mob/living/simple_animal/show_inv(mob/user as mob)
if(!can_collar)
return
user.set_machine(src)
var/dat = "<table><tr><td><B>Collar:</B></td><td><A href='?src=[UID()];item=[slot_collar]'>[(collar && !(collar.flags&ABSTRACT)) ? collar : "<font color=grey>Empty</font>"]</A></td></tr></table>"
dat += "<A href='?src=[user.UID()];mach_close=mob\ref[src]'>Close</A>"
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250)
popup.set_content(dat)
popup.open()
/mob/living/simple_animal/get_item_by_slot(slot_id)
switch(slot_id)
if(slot_collar)
return collar
. = ..()
/mob/living/simple_animal/can_equip(obj/item/I, slot, disable_warning = 0)
// . = ..() // Do not call parent. We do not want animals using their hand slots.
switch(slot)
if(slot_collar)
if(collar)
return 0
if(!can_collar)
return 0
if(!istype(I, /obj/item/clothing/accessory/petcollar))
return 0
return 1
/mob/living/simple_animal/equip_to_slot(obj/item/W, slot)
if(!istype(W))
return 0
if(!slot)
return 0
W.forceMove(src)
W.equipped(src, slot)
W.layer = 20
W.plane = HUD_PLANE
switch(slot)
if(slot_collar)
collar = W
if(collar.tagname)
name = collar.tagname
real_name = collar.tagname
regenerate_icons()
/mob/living/simple_animal/unEquip(obj/item/I, force)
. = ..()
if(!. || !I)
return
if(I == collar)
collar = null
regenerate_icons()
/mob/living/simple_animal/get_access()
. = ..()
if(collar)
. |= collar.GetAccess()
/* End Inventory */
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
return
+3 -1
View File
@@ -1222,9 +1222,11 @@ mob/proc/yank_out_object()
if(mind)
return mind.grab_ghost(force = force)
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
/mob/proc/notify_ghost_cloning(message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", sound = 'sound/effects/genetics.ogg', atom/source = null, flashwindow = TRUE)
var/mob/dead/observer/ghost = get_ghost()
if(ghost)
if(flashwindow)
window_flash(ghost.client)
ghost.notify_cloning(message, sound, source)
return ghost
+5 -3
View File
@@ -434,12 +434,14 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
lname = "<span class='name'>[lname]</span> "
to_chat(M, "<span class='deadsay'>[lname][follow][message]</span>")
/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/image/alert_overlay = null, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, atom/source = null, image/alert_overlay = null, attack_not_jump = 0, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
for(var/mob/dead/observer/O in player_list)
if(O.client)
to_chat(O, "<span class='ghostalert'>[message][(enter_link) ? " [enter_link]" : ""]<span>")
if(ghost_sound)
O << sound(ghost_sound)
if(flashwindow)
window_flash(O.client)
if(source)
var/obj/screen/alert/notify_action/A = O.throw_alert("\ref[source]_notify_action", /obj/screen/alert/notify_action)
if(A)
@@ -586,8 +588,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
if(5)
newletter="glor"
newphrase+="[newletter]";counter-=1
return newphrase
return newphrase
/mob/proc/get_preference(toggleflag)
if(!client)
return FALSE
@@ -375,3 +375,9 @@
desc = "A cap for children toys."
caliber = "caps"
projectile_type = /obj/item/projectile/bullet/cap
/obj/item/ammo_casing/laser
desc = "An experimental laser casing."
caliber = "laser"
projectile_type = /obj/item/projectile/beam/laser
icon_state = "lasercasing"
@@ -437,3 +437,12 @@
/obj/item/ammo_box/magazine/toy/m762/update_icon()
..()
icon_state = "a762-[round(ammo_count(),10)]"
/obj/item/ammo_box/magazine/laser
name = "encased laser projector magazine"
desc = "Fits experimental laser ammo casings."
icon_state = "laser"
ammo_type = /obj/item/ammo_casing/laser
origin_tech = "combat=3"
caliber = "laser"
max_ammo = 20
@@ -249,3 +249,15 @@
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
..()
empty_alarm()
/obj/item/weapon/gun/projectile/automatic/lasercarbine
name = "\improper IK-60 Laser Carbine"
desc = "An experimental carbine. Uses encased laser projectors as ammunition."//we need to uncouple the toroidal resistance dejammers
icon_state = "lasercarbine"
item_state = "laser"
w_class = 3
origin_tech = "combat=5;materials=5"
mag_type = /obj/item/ammo_box/magazine/laser
fire_sound = 'sound/weapons/emitter2.ogg'
can_suppress = 0
burst_size = 2
@@ -91,8 +91,7 @@
var/mob/living/carbon/human/H = M
//Mitocholide is hard enough to get, it's probably fair to make this all internal organs
for(var/name in H.internal_organs)
var/obj/item/organ/internal/I = H.get_int_organ(name)
for(var/obj/item/organ/internal/I in H.internal_organs)
if(I.damage > 0)
I.damage = max(I.damage-0.4, 0)
..()
@@ -635,7 +634,8 @@
return
var/mob/dead/observer/ghost = M.get_ghost()
if(ghost)
to_chat(ghost, "<span class='ghostalert'>Your are attempting to be revived with Strange Reagent. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
to_chat(ghost, "<span class='ghostalert'>You are attempting to be revived with Strange Reagent. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
M.visible_message("<span class='notice'>[M] doesn't appear to respond, perhaps try again later?</span>")
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
@@ -974,4 +974,4 @@
/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M)
M.adjustBrainLoss(-3)
..()
..()
@@ -67,12 +67,24 @@
/datum/chemical_reaction/slimemetal/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
M.amount = 15
M.forceMove(get_turf(holder.my_atom))
var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
P.amount = 5
P.forceMove(get_turf(holder.my_atom))
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/plasteel (location, 5)
new /obj/item/stack/sheet/metal (location, 15)
/datum/chemical_reaction/slimeglass
name = "Slime Glass"
id = "m_glass"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/metal
required_other = 1
/datum/chemical_reaction/slimeglass/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/rglass (location, 5)
new /obj/item/stack/sheet/glass (location, 15)
//Gold
/datum/chemical_reaction/slimecrit
@@ -209,8 +221,7 @@
required_other = 1
/datum/chemical_reaction/slimefrost/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
feedback_add_details("slime_cores_used","[type]")
/datum/chemical_reaction/slimestabilizer
name = "Slime Stabilizer"
@@ -226,8 +237,6 @@
var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer
P.forceMove(get_turf(holder.my_atom))
//Dark Blue
/datum/chemical_reaction/slimefreeze
name = "Slime Freeze"
@@ -383,12 +392,10 @@
/datum/chemical_reaction/slimeplasma/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
P.amount = 3
P.forceMove(get_turf(holder.my_atom))
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/mineral/plasma (location, 3)
//Red
/datum/chemical_reaction/slimemutator
name = "Slime Mutator"
id = "m_slimemutator"
@@ -661,4 +668,18 @@
var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black")
S.forceMove(get_turf(holder.my_atom))
S.visible_message("<span class='danger'>Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!</span>")
S.visible_message("<span class='danger'>Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!</span>")
/datum/chemical_reaction/slime_transfer
name = "Transfer Potion"
id = "slimetransfer"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime_transfer/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/transference/P = new /obj/item/slimepotion/transference
P.forceMove(get_turf(holder.my_atom))
+10 -5
View File
@@ -138,7 +138,8 @@
msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(GM)] in a disposals unit. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
return
if(!I) return
if(!I)
return
if(!user.drop_item())
return
@@ -530,14 +531,18 @@
has_fat_guy = 1 // set flag on holder
if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
var/obj/structure/bigDelivery/T = AM
src.destinationTag = T.sortTag
destinationTag = T.sortTag
if(istype(AM, /obj/item/smallDelivery) && !hasmob)
var/obj/item/smallDelivery/T = AM
src.destinationTag = T.sortTag
destinationTag = T.sortTag
//Drones can mail themselves through maint.
if(istype(AM, /mob/living/silicon/robot/drone))
var/mob/living/silicon/robot/drone/drone = AM
src.destinationTag = drone.mail_destination
destinationTag = drone.mail_destination
if(istype(AM, /obj/item/shippingPackage) && !hasmob)
var/obj/item/shippingPackage/sp = AM
if(sp.sealed) //only sealed packages get delivered to their intended destination
destinationTag = sp.sortTag
// start the movement process
@@ -987,7 +992,7 @@
/obj/structure/disposalpipe/sortjunction
icon_state = "pipe-j1s"
var/sortType = 0 //Look at the list called TAGGERLOCATIONS in setup.dm
var/sortType = 0 //Look at the list called TAGGERLOCATIONS in /code/_globalvars/lists/flavor_misc.dm
var/posdir = 0
var/negdir = 0
var/sortdir = 0
+186 -86
View File
@@ -35,6 +35,16 @@
sortTag = O.currTag
playsound(loc, 'sound/machines/twobeep.ogg', 100, 1)
else if(istype(W, /obj/item/shippingPackage))
var/obj/item/shippingPackage/sp = W
if(sp.sealed)
return
else
sortTag = sp.sortTag
to_chat(user, "<span class='notice'>You rip the label off the shipping package and affix it to [src].</span>")
qdel(sp)
playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
else if(istype(W, /obj/item/weapon/pen))
var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN)
if(!str || !length(str))
@@ -89,6 +99,16 @@
sortTag = O.currTag
playsound(loc, 'sound/machines/twobeep.ogg', 100, 1)
else if(istype(W, /obj/item/shippingPackage))
var/obj/item/shippingPackage/sp = W
if(sp.sealed)
return
else
sortTag = sp.sortTag
to_chat(user, "<span class='notice'>You rip the label off the shipping package and affix it to [src].</span>")
qdel(sp)
playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
else if(istype(W, /obj/item/weapon/pen))
var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN)
if(!str || !length(str))
@@ -134,7 +154,7 @@
if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box)))
if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box) && !istype(target, /obj/item/shippingPackage)))
var/obj/item/O = target
if(use(1))
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
@@ -235,101 +255,181 @@
var/c_mode = 0
New()
..()
spawn(5)
trunk = locate() in src.loc
if(trunk)
trunk.linked = src // link the pipe trunk to self
/obj/machinery/disposal/deliveryChute/New()
..()
spawn(5)
trunk = locate() in src.loc
if(trunk)
trunk.linked = src // link the pipe trunk to self
interact()
return
/obj/machinery/disposal/deliveryChute/interact()
return
update()
return
/obj/machinery/disposal/deliveryChute/update()
return
Bumped(var/atom/movable/AM) //Go straight into the chute
if(istype(AM, /obj/item/projectile)) return
switch(dir)
if(NORTH)
if(AM.loc.y != src.loc.y+1) return
if(EAST)
if(AM.loc.x != src.loc.x+1) return
if(SOUTH)
if(AM.loc.y != src.loc.y-1) return
if(WEST)
if(AM.loc.x != src.loc.x-1) return
/obj/machinery/disposal/deliveryChute/Bumped(atom/movable/AM) //Go straight into the chute
if(istype(AM, /obj/item/projectile)) return
switch(dir)
if(NORTH)
if(AM.loc.y != src.loc.y+1) return
if(EAST)
if(AM.loc.x != src.loc.x+1) return
if(SOUTH)
if(AM.loc.y != src.loc.y-1) return
if(WEST)
if(AM.loc.x != src.loc.x-1) return
if(istype(AM, /obj))
var/obj/O = AM
O.loc = src
else if(istype(AM, /mob))
var/mob/M = AM
M.loc = src
src.flush()
if(istype(AM, /obj))
var/obj/O = AM
O.loc = src
else if(istype(AM, /mob))
var/mob/M = AM
M.loc = src
src.flush()
flush()
flushing = 1
flick("intake-closing", src)
var/deliveryCheck = 0
var/obj/structure/disposalholder/H = new() // virtual holder object which actually
/obj/machinery/disposal/deliveryChute/flush()
flushing = 1
flick("intake-closing", src)
var/deliveryCheck = 0
var/obj/structure/disposalholder/H = new() // virtual holder object which actually
// travels through the pipes.
for(var/obj/structure/bigDelivery/O in src)
deliveryCheck = 1
if(O.sortTag == 0)
O.sortTag = 1
for(var/obj/item/smallDelivery/O in src)
deliveryCheck = 1
if(O.sortTag == 0)
O.sortTag = 1
if(deliveryCheck == 0)
H.destinationTag = 1
for(var/obj/structure/bigDelivery/O in src)
deliveryCheck = 1
if(O.sortTag == 0)
O.sortTag = 1
for(var/obj/item/smallDelivery/O in src)
deliveryCheck = 1
if(O.sortTag == 0)
O.sortTag = 1
for(var/obj/item/shippingPackage/O in src)
deliveryCheck = 1
if(!O.sealed || O.sortTag == 0) //unsealed or untagged shipping packages will default to disposals
O.sortTag = 1
if(deliveryCheck == 0)
H.destinationTag = 1
sleep(10)
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
sleep(5) // wait for animation to finish
sleep(10)
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
sleep(5) // wait for animation to finish
H.init(src) // copy the contents of disposer to holder
air_contents = new() // The holder just took our gas; replace it
H.start(src) // start the holder processing movement
flushing = 0
// now reset disposal state
flush = 0
if(mode == 2) // if was ready,
mode = 1 // switch to charging
update()
H.init(src) // copy the contents of disposer to holder
air_contents = new() // The holder just took our gas; replace it
H.start(src) // start the holder processing movement
flushing = 0
// now reset disposal state
flush = 0
if(mode == 2) // if was ready,
mode = 1 // switch to charging
update()
return
/obj/machinery/disposal/deliveryChute/attackby(obj/item/I, mob/user, params)
if(!I || !user)
return
attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
if(istype(I, /obj/item/weapon/screwdriver))
if(c_mode==0)
c_mode=1
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(c_mode==1)
c_mode=0
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
to_chat(user, "You start slicing the floorweld off the delivery chute.")
if(do_after(user,20, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the delivery chute.")
var/obj/structure/disposalconstruct/C = new (src.loc)
C.ptype = 8 // 8 = Delivery chute
C.update()
C.anchored = 1
C.density = 1
qdel(src)
return
else
to_chat(user, "You need more welding fuel to complete this task.")
return
if(istype(I, /obj/item/weapon/screwdriver))
if(c_mode==0)
c_mode=1
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(c_mode==1)
c_mode=0
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
to_chat(user, "You start slicing the floorweld off the delivery chute.")
if(do_after(user,20, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the delivery chute.")
var/obj/structure/disposalconstruct/C = new (src.loc)
C.ptype = 8 // 8 = Delivery chute
C.update()
C.anchored = 1
C.density = 1
qdel(src)
return
else
to_chat(user, "You need more welding fuel to complete this task.")
/obj/item/shippingPackage
name = "Shipping package"
desc = "A pre-labeled package for shipping an item to coworkers."
icon = 'icons/obj/storage.dmi'
icon_state = "shippack"
var/obj/item/wrapped = null
var/sortTag = 0
var/sealed = 0
/obj/item/shippingPackage/attackby(obj/item/O, mob/user, params)
if(sealed)
if(istype(O, /obj/item/weapon/pen))
var/str = copytext(sanitize(input(user,"Intended recipient?","Address","")),1,MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, "<span class='notice'>Invalid text.</span>")
return
user.visible_message("<span class='notice'>[user] addresses [src] to [str].</span>")
name = "Shipping package (RE: [str])"
return
if(wrapped)
to_chat(user, "<span class='notice'>[src] already contains \a [wrapped].</span>")
return
if(istype(O, /obj/item) && !istype(O, /obj/item/weapon/storage) && !istype(O, /obj/item/shippingPackage))
if(!user.canUnEquip(O))
to_chat(user, "<span class='warning'>[O] is stuck to your hand, you cannot put it in [src]!</span>")
return
if(O.w_class > 3)
to_chat(user, "<span class='notice'>[O] is too large to fit in [src].</span>")
else
wrapped = O
user.unEquip(O)
O.forceMove(src)
O.add_fingerprint(usr)
add_fingerprint(usr)
to_chat(user, "<span class='notice'>You put [O] in [src].</span>")
/obj/item/shippingPackage/attack_self(mob/user)
if(sealed)
to_chat(user, "<span class='notice'>You tear open [src], dropping the contents onto the floor.</span>")
playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
user.unEquip(src)
wrapped.forceMove(get_turf(user))
wrapped = null
qdel(src)
else if(wrapped)
switch(alert("Select an action:",, "Remove Object", "Seal Package", "Cancel"))
if("Remove Object")
to_chat(user, "<span class='notice'>You shake out [src]'s contents onto the floor.</span>")
wrapped.forceMove(get_turf(user))
wrapped = null
if("Seal Package")
to_chat(user, "<span class='notice'>You seal [src], preparing it for delivery.</span>")
icon_state = "shippack_sealed"
sealed = 1
update_desc()
else
if(alert("Do you want to tear up the package?",, "Yes", "No") == "Yes")
to_chat(user, "<span class='notice'>You shred [src].</span>")
playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1)
user.unEquip(src)
qdel(src)
/obj/item/shippingPackage/proc/update_desc()
desc = "A pre-labeled package for shipping an item to coworkers."
if(sortTag)
desc += " The label says \"Deliver to [TAGGERLOCATIONS[sortTag]]\"."
if(!sealed)
desc += " The package is not sealed."
/obj/item/shippingPackage/Destroy()
if(wrapped)
qdel(wrapped)
wrapped = null
return ..()
@@ -25,8 +25,8 @@
..()
/obj/item/slime_extract/New()
..()
create_reagents(100)
..()
create_reagents(100)
/obj/item/slime_extract/grey
name = "grey slime extract"
@@ -124,7 +124,9 @@
w_class = 1
origin_tech = "biotech=4"
/obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user , proximity)
/obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user, proximity_flag)
if(!proximity_flag)
return
if(istype(target))
to_chat(user, "<span class='notice'>You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb.</span>") // le fluff faec
return
@@ -174,7 +176,7 @@
/obj/item/slimepotion/sentience
name = "sentience potion"
desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being."
desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
origin_tech = "biotech=5"
@@ -182,7 +184,9 @@
var/being_used = 0
var/sentience_type = SENTIENCE_ORGANIC
/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user)
/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user, proximity_flag)
if(!proximity_flag)
return
if(being_used || !ismob(M))
return
if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled
@@ -221,6 +225,50 @@
being_used = 0
..()
/obj/item/slimepotion/transference
name = "consciousness transference potion"
desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
origin_tech = "biotech=6"
var/prompted = FALSE
var/animal_type = SENTIENCE_ORGANIC
/obj/item/slimepotion/transference/afterattack(mob/living/M, mob/user, proximity_flag)
if(!proximity_flag)
return
if(prompted || !ismob(M))
return
if(!isanimal(M) || M.ckey) //much like sentience, these will not work on something that is already player controlled
to_chat(user, "<span class='warning'>[M] already has a higher consciousness!</span>")
return ..()
if(M.stat)
to_chat(user, "<span class='warning'>[M] is dead!</span>")
return ..()
var/mob/living/simple_animal/SM = M
if(SM.sentience_type != animal_type)
to_chat(user, "<span class='warning'>You cannot transfer your consciousness to [SM].</span>") //no controlling machines
return ..()
if(jobban_isbanned(user, ROLE_SENTIENT))
to_chat(user, "<span class='warning'>Your mind goes blank as you attempt to use the potion.</span>")
return
prompted = TRUE
if(alert("This will permanently transfer your consciousness to [SM]. Are you sure you want to do this?",,"Yes","No")=="No")
prompted = FALSE
return
to_chat(user, "<span class='notice'>You drink the potion then place your hands on [SM]...</span>")
user.mind.transfer_to(SM)
SM.universal_speak = 1
SM.faction = user.faction
SM.sentience_act() //Same deal here as with sentience
user.death()
to_chat(SM, "<span class='notice'>In a quick flash, you feel your consciousness flow into [SM]!</span>")
to_chat(SM, "<span class='warning'>You are now [SM]. Your allegiances, alliances, and roles are still the same as they were prior to consciousness transfer!</span>")
SM.name = "[SM.name] as [user.real_name]"
qdel(src)
/obj/item/slimepotion/steroid
name = "slime steroid"
desc = "A potent chemical mix that will cause a baby slime to generate more extract."
@@ -303,15 +351,17 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
/obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user)
/obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user, proximity_flag)
if(!proximity_flag)
return
..()
if(!istype(C))
to_chat(user, "<span class='warning'>The potion can only be used on items!</span>")
return
if(C.slowdown <= 0)
to_chat(user, "<span class='warning'>The [C] can't be made any faster!</span>")
to_chat(user, "<span class='warning'>[C] can't be made any faster!</span>")
return..()
to_chat(user, "<span class='notice'>You slather the red gunk over the [C], making it faster.</span>")
to_chat(user, "<span class='notice'>You slather the red gunk over [C], making it faster.</span>")
C.color = "#FF0000"
C.slowdown = 0
qdel(src)
@@ -323,8 +373,10 @@
icon_state = "bottle17"
var/uses = 3
/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user)
/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user, proximity_flag)
..()
if(!proximity_flag)
return
if(!uses)
qdel(src)
return
@@ -332,9 +384,9 @@
to_chat(user, "<span class='warning'>The potion can only be used on clothing!</span>")
return
if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
to_chat(user, "<span class='warning'>The [C] is already fireproof!</span>")
to_chat(user, "<span class='warning'>[C] is already fireproof!</span>")
return ..()
to_chat(user, "<span class='notice'>You slather the blue gunk over the [C], fireproofing it.</span>")
to_chat(user, "<span class='notice'>You slather the blue gunk over [C], fireproofing it.</span>")
C.name = "fireproofed [C.name]"
C.color = "#000080"
C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
@@ -366,9 +418,9 @@
else
icon_state = "golem"
/obj/effect/golemrune/attack_hand(mob/living/user as mob)
/obj/effect/golemrune/attack_hand(mob/living/user)
var/mob/dead/observer/ghost
for(var/mob/dead/observer/O in src.loc)
for(var/mob/dead/observer/O in loc)
if(!check_observer(O))
to_chat(O, "\red You are not eligible to become a golem.")
continue
@@ -391,21 +443,22 @@
volunteer(O)
/obj/effect/golemrune/attack_ghost(var/mob/dead/observer/O)
if(!O) return
if(!O)
return
volunteer(O)
/obj/effect/golemrune/proc/check_observer(var/mob/dead/observer/O)
if(!O)
return 0
return FALSE
if(!O.client)
return 0
return FALSE
if(O.mind && O.mind.current && O.mind.current.stat != DEAD)
return 0
return FALSE
if(!O.can_reenter_corpse)
return 0
return FALSE
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
return 0
return 1
return FALSE
return TRUE
/obj/effect/golemrune/proc/volunteer(var/mob/dead/observer/O)
if(O in ghosts)
@@ -448,8 +501,8 @@
/obj/effect/timestop/proc/timestop()
playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1)
for(var/i in 1 to duration-1)
for(var/A in orange (freezerange, src.loc))
if(istype(A, /mob/living))
for(var/A in orange (freezerange, loc))
if(isliving(A))
var/mob/living/M = A
if(M in immune)
continue
+1 -2
View File
@@ -24,14 +24,13 @@
return 0
var/dental_implants = 0
for(var/obj/item/weapon/reagent_containers/food/pill in target.internal_organs) // Can't give them more than 4 dental implants.
for(var/obj/item/weapon/reagent_containers/food/pill in target.contents) // Can't give them more than 4 dental implants.
dental_implants++
if(dental_implants >= 4)
user.visible_message("[user] pulls \the [tool] back out of [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You pull \the [tool] back out of [target]'s [parse_zone(target_zone)], there wans't enough room...</span>")
return 0
user.drop_item()
target.internal_organs += tool
tool.forceMove(target)
var/datum/action/item_action/hands_free/activate_pill/P = new
+52
View File
@@ -55,6 +55,58 @@
-->
<div class="commit sansserif">
<h2 class="date">31 January 2017</h2>
<h3 class="author">Ar3nn updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">cursed cluwne mask now allows internals to be fed through it</li>
</ul>
<h3 class="author">FalseIncarnate updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">All requests consoles can print off a single-use, pre-tagged Shipping Package for sending a single item via disposals to a destination of your choosing.</li>
<li class="rscadd">Shipping Packages can be used to tag packages wrapped with wrapping paper, in case you don't have access to cargo's destination tagger.</li>
<li class="rscadd">Requests Consoles log the printer and destination of all shipping labels printed from that particular console. There currently is no way to clear your mailing history, so mail responsibly.</li>
</ul>
<h3 class="author">Fethas updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes a rune runtime.</li>
</ul>
<h3 class="author">FlattestGuitar updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">adds an admin-only laser carbine</li>
</ul>
<h3 class="author">uraniummeltdown updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Your game window will now flash on receiving Admin PMs, being revived, and ghost roles. You can disable this in Game Preferences.</li>
</ul>
<h2 class="date">30 January 2017</h2>
<h3 class="author">Alexshreds updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">No more double traitor 241 Special</li>
</ul>
<h2 class="date">29 January 2017</h2>
<h3 class="author">uraniummeltdown updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">You can now take items directly out of a storage item in your backpack.</li>
</ul>
<h2 class="date">27 January 2017</h2>
<h3 class="author">Alffd updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Adds missing hat and shoe sprites that were inadvertently deleted.</li>
</ul>
<h3 class="author">Fox McCloud updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds in stungloves (inaccessible to players)</li>
</ul>
<h3 class="author">uraniummeltdown updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Injecting a rainbow slime extract with blood will create a consciousness transference potion.</li>
<li class="rscadd">Injecting a metal slime extract with water will create 15 sheets of glass and 5 sheets of reinforced glass.</li>
<li class="bugfix">Slime potions now check for proximity.</li>
</ul>
<h2 class="date">26 January 2017</h2>
<h3 class="author">FalseIncarnate updated:</h3>
<ul class="changes bgimages16">
+35
View File
@@ -3423,3 +3423,38 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
of the silentfather.
FreeStylaLT:
- tweak: AI sat transport tubes are no longer misaligned
2017-01-27:
Alffd:
- bugfix: Adds missing hat and shoe sprites that were inadvertently deleted.
Fox McCloud:
- rscadd: Adds in stungloves (inaccessible to players)
uraniummeltdown:
- rscadd: Injecting a rainbow slime extract with blood will create a consciousness
transference potion.
- rscadd: Injecting a metal slime extract with water will create 15 sheets of glass
and 5 sheets of reinforced glass.
- bugfix: Slime potions now check for proximity.
2017-01-29:
uraniummeltdown:
- tweak: You can now take items directly out of a storage item in your backpack.
2017-01-30:
Alexshreds:
- bugfix: No more double traitor 241 Special
2017-01-31:
Ar3nn:
- tweak: cursed cluwne mask now allows internals to be fed through it
FalseIncarnate:
- rscadd: All requests consoles can print off a single-use, pre-tagged Shipping
Package for sending a single item via disposals to a destination of your choosing.
- rscadd: Shipping Packages can be used to tag packages wrapped with wrapping paper,
in case you don't have access to cargo's destination tagger.
- rscadd: Requests Consoles log the printer and destination of all shipping labels
printed from that particular console. There currently is no way to clear your
mailing history, so mail responsibly.
Fethas:
- bugfix: Fixes a rune runtime.
FlattestGuitar:
- rscadd: adds an admin-only laser carbine
uraniummeltdown:
- rscadd: Your game window will now flash on receiving Admin PMs, being revived,
and ghost roles. You can disable this in Game Preferences.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 85 KiB

+32 -2
View File
@@ -3,8 +3,8 @@ Title: Request Console
Used In File(s): \code\game\machinery\requests_console.dm
#define RCS_MAINMENU 0 // Main men
#define RCS_RQASSIST 1 // Request supplies
#define RCS_RQSUPPLY 2 // Request assistance
#define RCS_RQSUPPLY 1 // Request supplies
#define RCS_RQASSIST 2 // Request assistance
#define RCS_SENDINFO 3 // Relay information
#define RCS_SENTPASS 4 // Message sent successfully
#define RCS_SENTFAIL 5 // Message sent unsuccessfully
@@ -102,6 +102,33 @@ Used In File(s): \code\game\machinery\requests_console.dm
{{:helper.link('Announce', 'signal', { 'sendAnnouncement' : 1 }, (data.announceAuth && data.message) ? null : 'disabled' )}}
{{:helper.link('Back', 'arrow-left', { 'setScreen' : 0 })}}
</div>
{{else data.screen == 9}}
<div class="item"><h3>Print a Shipping Label.</h3></div>
<div class="statusDisplay" style="overflow: auto;">
<div class="item"><b>Destination:</b> {{:data.shipDest}}</div>
<div class="item"><b>Validated by:</b> {{:data.msgVerified}}</div>
<div class="item">{{:helper.link('Print Label', null, { 'printLabel' : 1 })}}</div>
</div>
<table class="block">
{{for data.ship_dept}}
<tr>
<td><div class="itemLabelWidest" align="right">{{:value}} -</div></td>
<td><div class="item">{{:helper.link('Select', null, { 'shipSelect' : value })}}</div></td>
</tr>
{{empty}}
<tr><td><div class="itemLabel">There are no available shipping destinations.</div></td></tr>
{{/for}}
</table><br>
<div class="item">{{:helper.link('Back', 'arrow-left', { 'setScreen' : 0 })}}</div>
{{else data.screen == 10}}
<div class="statusDisplay" style="overflow: auto;">
{{for data.shipping_log}}
<div class="item">{{:value}}</div>
{{empty}}
<div class="item">No shipping labels have been printed.</div>
{{/for}}
</div>
<div class="item">{{:helper.link('Back', 'arrow-left', { 'setScreen' : 0 })}}</div>
{{else}}
{{if data.newmessagepriority == 1}}
<div class="item"><font color='red'>There are new messages</font></div>
@@ -114,6 +141,9 @@ Used In File(s): \code\game\machinery\requests_console.dm
<div class="item">{{:helper.link('Request Supplies', 'gear', { 'setScreen' : 2 })}}</div>
<div class="item">{{:helper.link('Relay Anonymous Information', 'gear', { 'setScreen' : 3})}}</div>
<br>
<div class="item">{{:helper.link('Print Shipping Label', 'gear', { 'setScreen' : 9})}}</div>
<div class="item">{{:helper.link('View Shipping Logs', 'gear', { 'setScreen' : 10})}}</div>
<br>
{{if data.announcementConsole}}
<div class="item">{{:helper.link('Send Station-wide Announcement', 'signal', { 'setScreen' : 8})}}</div>
<br>