diff --git a/.travis.yml b/.travis.yml
index 2316c4bacc2..563545ca020 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,5 +26,6 @@ script:
- (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano)
- (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; [ $num -le 1355 ])
- ( md5sum -c - <<< "0af969f671fba6cf9696c78cd175a14a *baystation12.int")
- - DreamMaker baystation12.dme
+ - python tools/TagMatcher/tag-matcher.py ../..
- python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs
+ - DreamMaker baystation12.dme
diff --git a/baystation12.dme b/baystation12.dme
index e12a801c636..9f274fb756f 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -15,6 +15,7 @@
#include "code\names.dm"
#include "code\stylesheet.dm"
#include "code\world.dm"
+#include "code\__defines\_compile_options.dm"
#include "code\__defines\admin.dm"
#include "code\__defines\atmos.dm"
#include "code\__defines\chemistry.dm"
@@ -600,7 +601,10 @@
#include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.dm"
-#include "code\game\objects\items\devices\uplinks.dm"
+#include "code\game\objects\items\devices\uplink.dm"
+#include "code\game\objects\items\devices\uplink_categories.dm"
+#include "code\game\objects\items\devices\uplink_items.dm"
+#include "code\game\objects\items\devices\uplink_random_lists.dm"
#include "code\game\objects\items\devices\violin.dm"
#include "code\game\objects\items\devices\whistle.dm"
#include "code\game\objects\items\devices\PDA\cart.dm"
@@ -621,7 +625,6 @@
#include "code\game\objects\items\stacks\nanopaste.dm"
#include "code\game\objects\items\stacks\rods.dm"
#include "code\game\objects\items\stacks\stack.dm"
-#include "code\game\objects\items\stacks\sheets\glass.dm"
#include "code\game\objects\items\stacks\sheets\leather.dm"
#include "code\game\objects\items\stacks\sheets\light.dm"
#include "code\game\objects\items\stacks\tiles\light.dm"
@@ -1145,6 +1148,7 @@
#include "code\modules\mob\language\synthetic.dm"
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\default_language.dm"
+#include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm"
@@ -1511,6 +1515,7 @@
#include "code\modules\reagents\Chemistry-Colours.dm"
#include "code\modules\reagents\Chemistry-Holder.dm"
#include "code\modules\reagents\Chemistry-Machinery.dm"
+#include "code\modules\reagents\Chemistry-Metabolism.dm"
#include "code\modules\reagents\Chemistry-Readme.dm"
#include "code\modules\reagents\Chemistry-Reagents.dm"
#include "code\modules\reagents\Chemistry-Recipes.dm"
diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm
index f6d24814683..922275bcc91 100644
--- a/code/ZAS/Controller.dm
+++ b/code/ZAS/Controller.dm
@@ -281,8 +281,8 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
var/direct = !(block & ZONE_BLOCKED)
var/space = !istype(B)
- if(!space)
- if(min(A.zone.contents.len, B.zone.contents.len) < ZONE_MIN_SIZE || (direct && (equivalent_pressure(A.zone,B.zone) || current_cycle == 0)))
+ if(direct && !space)
+ if(min(A.zone.contents.len, B.zone.contents.len) <= ZONE_MIN_SIZE || equivalent_pressure(A.zone,B.zone) || current_cycle == 0)
merge(A.zone,B.zone)
return
diff --git a/code/__defines/_compile_options.dm b/code/__defines/_compile_options.dm
new file mode 100644
index 00000000000..ac5f7120fd6
--- /dev/null
+++ b/code/__defines/_compile_options.dm
@@ -0,0 +1,2 @@
+#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary.
+ // 1 will enable set background. 0 will disable set background.
\ No newline at end of file
diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index 936d80890d7..6e1acef8ce1 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -80,6 +80,8 @@ var/list/be_special_flags = list(
#define MODE_MALFUNCTION "malf"
#define MODE_TRAITOR "traitor"
+#define DEFAULT_TELECRYSTAL_AMOUNT 12
+
/////////////////
////WIZARD //////
/////////////////
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 289b1937c67..ecca29bfd19 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -135,6 +135,7 @@
#define WALL_CAN_OPEN 1
#define WALL_OPENING 2
+#define DEFAULT_TABLE_MATERIAL "plastic"
#define DEFAULT_WALL_MATERIAL "steel"
#define SHARD_SHARD "shard"
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 5a56b34e617..b22266274a7 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -115,7 +115,7 @@
if(W.flags&USEDELAY)
next_move += 5
- var/resolved = A.attackby(W,src)
+ var/resolved = W.resolve_attackby(A, src)
if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1 indicates adjacency
else
@@ -136,7 +136,7 @@
next_move += 5
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
- var/resolved = A.attackby(W,src)
+ var/resolved = W.resolve_attackby(A,src)
if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1: clicking something Adjacent
else
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 0ba005455c6..f3419b074af 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -74,135 +74,104 @@ var/const/tk_maxrange = 15
var/atom/movable/focus = null
var/mob/living/host = null
+/obj/item/tk_grab/dropped(mob/user as mob)
+ if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item
+ if(focus.Adjacent(loc))
+ focus.loc = loc
+ loc = null
+ spawn(1)
+ qdel(src)
+ return
- dropped(mob/user as mob)
- if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item
- if(focus.Adjacent(loc))
- focus.loc = loc
+//stops TK grabs being equipped anywhere but into hands
+/obj/item/tk_grab/equipped(var/mob/user, var/slot)
+ if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return
+ qdel(src)
+ return
+/obj/item/tk_grab/attack_self(mob/user as mob)
+ if(focus)
+ focus.attack_self_tk(user)
+
+/obj/item/tk_grab/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this
+ if(!target || !user) return
+ if(last_throw+3 > world.time) return
+ if(!host || host != user)
qdel(src)
return
-
-
- //stops TK grabs being equipped anywhere but into hands
- equipped(var/mob/user, var/slot)
- if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return
+ if(!(TK in host.mutations))
qdel(src)
return
+ if(isobj(target) && !isturf(target.loc))
+ return
-
- attack_self(mob/user as mob)
- if(focus)
- focus.attack_self_tk(user)
-
- afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this
- if(!target || !user) return
- if(last_throw+3 > world.time) return
- if(!host || host != user)
- qdel(src)
- return
- if(!(TK in host.mutations))
- qdel(src)
- return
- if(isobj(target) && !isturf(target.loc))
- return
-
- var/d = get_dist(user, target)
- if(focus) d = max(d,get_dist(user,focus)) // whichever is further
- switch(d)
- if(0)
- ;
- if(1 to 5) // not adjacent may mean blocked by window
- if(!proximity)
- user.next_move += 2
- if(5 to 7)
- user.next_move += 5
- if(8 to tk_maxrange)
- user.next_move += 10
- else
- user << "Your mind won't reach that far."
- return
-
- if(!focus)
- focus_object(target, user)
- return
-
- if(target == focus)
- target.attack_self_tk(user)
- return // todo: something like attack_self not laden with assumptions inherent to attack_self
-
-
- if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus))
- var/obj/item/I = focus
- var/resolved = target.attackby(I, user, user:get_organ_target())
- if(!resolved && target && I)
- I.afterattack(target,user,1) // for splashing with beakers
-
-
+ var/d = get_dist(user, target)
+ if(focus) d = max(d,get_dist(user,focus)) // whichever is further
+ switch(d)
+ if(0)
+ ;
+ if(1 to 5) // not adjacent may mean blocked by window
+ if(!proximity)
+ user.next_move += 2
+ if(5 to 7)
+ user.next_move += 5
+ if(8 to tk_maxrange)
+ user.next_move += 10
else
- apply_focus_overlay()
- focus.throw_at(target, 10, 1, user)
- last_throw = world.time
- return
-
- attack(mob/living/M as mob, mob/living/user as mob, def_zone)
- return
-
-
- proc/focus_object(var/obj/target, var/mob/living/user)
- if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
- if(target.anchored || !isturf(target.loc))
- qdel(src)
+ user << "Your mind won't reach that far."
return
- focus = target
- update_icon()
+
+ if(!focus)
+ focus_object(target, user)
+ return
+
+ if(target == focus)
+ target.attack_self_tk(user)
+ return // todo: something like attack_self not laden with assumptions inherent to attack_self
+
+
+ if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus))
+ var/obj/item/I = focus
+ var/resolved = target.attackby(I, user, user:get_organ_target())
+ if(!resolved && target && I)
+ I.afterattack(target,user,1) // for splashing with beakers
+ else
apply_focus_overlay()
+ focus.throw_at(target, 10, 1, user)
+ last_throw = world.time
+ return
+
+/obj/item/tk_grab/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
+ return
+
+
+/obj/item/tk_grab/proc/focus_object(var/obj/target, var/mob/living/user)
+ if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
+ if(target.anchored || !isturf(target.loc))
+ qdel(src)
return
-
-
- proc/apply_focus_overlay()
- if(!focus) return
- var/obj/effect/overlay/O = PoolOrNew(/obj/effect/overlay, locate(focus.x,focus.y,focus.z))
- O.name = "sparkles"
- O.anchored = 1
- O.density = 0
- O.layer = FLY_LAYER
- O.set_dir(pick(cardinal))
- O.icon = 'icons/effects/effects.dmi'
- O.icon_state = "nothing"
- flick("empdisable",O)
- spawn(5)
- qdel(O)
- return
-
-
+ focus = target
update_icon()
- overlays.Cut()
- if(focus && focus.icon && focus.icon_state)
- overlays += icon(focus.icon,focus.icon_state)
- return
+ apply_focus_overlay()
+ return
-/*Not quite done likely needs to use something thats not get_step_to
- proc/check_path()
- var/turf/ref = get_turf(src.loc)
- var/turf/target = get_turf(focus.loc)
- if(!ref || !target) return 0
- var/distance = get_dist(ref, target)
- if(distance >= 10) return 0
- for(var/i = 1 to distance)
- ref = get_step_to(ref, target, 0)
- if(ref != target) return 0
- return 1
-*/
-
-//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1)
-/*
- if(istype(user, /mob/living/carbon))
- if(user:mutations & TK && get_dist(source, user) <= 7)
- if(user:get_active_hand()) return 0
- var/X = source:x
- var/Y = source:y
- var/Z = source:z
-
-*/
+/obj/item/tk_grab/proc/apply_focus_overlay()
+ if(!focus) return
+ var/obj/effect/overlay/O = PoolOrNew(/obj/effect/overlay, locate(focus.x,focus.y,focus.z))
+ O.name = "sparkles"
+ O.anchored = 1
+ O.density = 0
+ O.layer = FLY_LAYER
+ O.set_dir(pick(cardinal))
+ O.icon = 'icons/effects/effects.dmi'
+ O.icon_state = "nothing"
+ flick("empdisable",O)
+ spawn(5)
+ qdel(O)
+ return
+/obj/item/tk_grab/update_icon()
+ overlays.Cut()
+ if(focus && focus.icon && focus.icon_state)
+ overlays += icon(focus.icon,focus.icon_state)
+ return
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index af4d8ef2967..77bda01654d 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -91,6 +91,7 @@ var/list/gamemode_cache = list()
var/guests_allowed = 1
var/debugparanoid = 0
+ var/serverurl
var/server
var/banappeals
var/wikiurl
@@ -163,6 +164,7 @@ var/list/gamemode_cache = list()
var/use_irc_bot = 0
var/irc_bot_host = ""
+ var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge
var/main_irc = ""
var/admin_irc = ""
var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
@@ -385,6 +387,9 @@ var/list/gamemode_cache = list()
if ("hostedby")
config.hostedby = value
+ if ("serverurl")
+ config.serverurl = value
+
if ("server")
config.server = value
@@ -500,6 +505,9 @@ var/list/gamemode_cache = list()
if("use_irc_bot")
use_irc_bot = 1
+ if("irc_bot_export")
+ irc_bot_export = 1
+
if("ticklag")
Ticklag = text2num(value)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index c3a77b4b0e7..1b3fc7b4597 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -29,7 +29,7 @@
*/
-datum/mind
+/datum/mind
var/key
var/name //replaces mob/var/original_name
var/mob/living/current
@@ -58,459 +58,389 @@ datum/mind
// the world.time since the mob has been brigged, or -1 if not at all
var/brigged_since = -1
- New(var/key)
- src.key = key
-
//put this here for easier tracking ingame
var/datum/money_account/initial_account
- proc/transfer_to(mob/living/new_character)
- if(!istype(new_character))
- world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn"
- if(current) //remove ourself from our old body's mind variable
- if(changeling)
- current.remove_changeling_powers()
- current.verbs -= /datum/changeling/proc/EvolutionMenu
- current.mind = null
+/datum/mind/New(var/key)
+ src.key = key
- nanomanager.user_transferred(current, new_character) // transfer active NanoUI instances to new user
- if(new_character.mind) //remove any mind currently in our new body's mind variable
- new_character.mind.current = null
-
- current = new_character //link ourself to our new body
- new_character.mind = src //and link our new body to ourself
+/datum/mind/proc/transfer_to(mob/living/new_character)
+ if(!istype(new_character))
+ world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn"
+ if(current) //remove ourself from our old body's mind variable
if(changeling)
- new_character.make_changeling()
+ current.remove_changeling_powers()
+ current.verbs -= /datum/changeling/proc/EvolutionMenu
+ current.mind = null
- if(active)
- new_character.key = key //now transfer the key to link the client to our new body
+ nanomanager.user_transferred(current, new_character) // transfer active NanoUI instances to new user
+ if(new_character.mind) //remove any mind currently in our new body's mind variable
+ new_character.mind.current = null
- proc/store_memory(new_text)
- memory += "[new_text]
"
+ current = new_character //link ourself to our new body
+ new_character.mind = src //and link our new body to ourself
- proc/show_memory(mob/recipient)
- var/output = "[current.real_name]'s Memory
{{:value}} - |
+ {{:helper.link('Message', null, { 'write' : value , 'priority' : 1 })}} |
+ {{:helper.link('High Priority', null, { 'write' : value , 'priority' : 2 })}} |
+
There are no available departments to request assistance from. |
{{:value}} - |
+ {{:helper.link('Message', null, { 'write' : value , 'priority' : 1 })}} |
+ {{:helper.link('High Priority', null, { 'write' : value , 'priority' : 2 })}} |
+
There are no available departments to request supplies from. |
{{:value}} - |
+ {{:helper.link('Message', null, { 'write' : value , 'priority' : 1 })}} |
+ {{:helper.link('High Priority', null, { 'write' : value , 'priority' : 2 })}} |
+
There are no available departments to relay information to. |