Name | Status | Location | Control |
"
+
+ for (Bot in machines)
+ if(Bot.z == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected!
+ bot_area = get_area(Bot)
+ d += "| [Bot.hacked ? "(!) [Bot.name]" : Bot.name] | "
+ //If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all.
+ d += "[Bot.on ? "[Bot.mode ? "[ Bot.mode_name[Bot.mode] ]": "Idle"]" : "Inactive"] | "
+ d += "[bot_area.name] | "
+ d += "Interface | "
+ d += "Call | "
+ d += "
"
+ d = format_text(d)
+
+ var/datum/browser/popup = new(src, "botcall", "Remote Robot Control", 700, 400)
+ popup.set_content(d)
+ popup.open()
+
+/mob/living/silicon/ai/proc/set_waypoint(var/atom/A)
+ var/turf/turf_check = get_turf(A)
+ //The target must be in view of a camera or near the core.
+ if(turf_check in range(get_turf(src)))
+ call_bot(turf_check)
+ else if(cameranet && cameranet.checkTurfVis(turf_check))
+ call_bot(turf_check)
+ else
+ src << "Selected location is not visible."
+
+/mob/living/silicon/ai/proc/call_bot(var/turf/waypoint)
+
+ if(!Bot)
+ return
+
+ if(Bot.calling_ai && Bot.calling_ai != src) //Prevents an override if another AI is controlling this bot.
+ src << "Interface error. Unit is already in use."
+ return
+
+ Bot.call_bot(src, waypoint)
+
/mob/living/silicon/ai/triggerAlarm(var/class, area/A, var/O, var/alarmsource)
if (stat == 2)
return 1
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index 158d11795fb..fe89288765e 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -1,4 +1,4 @@
-/mob/living/silicon/robot/Process_Spacemove()
+/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
if(module)
for(var/obj/item/weapon/tank/jetpack/J in module.modules)
if(J && istype(J, /obj/item/weapon/tank/jetpack))
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index c010d9daf55..4ff94d16b97 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -238,5 +238,5 @@
playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \
Bring those who still cling to this world of illusion back to the Geometer so they may know Truth."
-/mob/living/simple_animal/construct/harvester/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/construct/harvester/Process_Spacemove(var/movement_dir = 0)
return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 5cc28028e21..0ac3781a406 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -28,8 +28,10 @@
if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
- Move(get_step(src,pick(4,8)))
- turns_since_move = 0
+ var/east_vs_west = pick(4,8)
+ if(Process_Spacemove(east_vs_west))
+ Move(get_step(src,east_vs_west), east_vs_west)
+ turns_since_move = 0
regenerate_icons()
//COFFEE! SQUEEEEEEEEE!
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 5883e9ca38c..ebb220c9a72 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -57,7 +57,7 @@
var/step = get_step(src, direction)
if(step)
if(locate(/obj/effect/spacevine) in step)
- Move(step)
+ Move(step, get_dir(src, step))
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 7953f92cdae..748e216feed 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -54,7 +54,7 @@
else
icon_state = "bearfloor"
-/mob/living/simple_animal/hostile/bear/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/hostile/bear/Process_Spacemove(var/movement_dir = 0)
return 1 //No drifting in space for space bears!
/mob/living/simple_animal/hostile/bear/FindTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 24390b58870..a543b85b750 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -38,7 +38,7 @@ F
faction = list("carp")
-/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/FindTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
new file mode 100644
index 00000000000..46f2e679e22
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm
@@ -0,0 +1,34 @@
+
+
+/mob/living/simple_animal/hostile/carp/eyeball
+ name = "eyeball"
+ desc = "An odd looking creature, it won't stop staring..."
+ icon_state = "eyeball"
+ icon_living = "eyeball"
+ icon_dead = ""
+ icon_gib = ""
+ meat_type = null
+ meat_amount = 0
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "hits"
+ maxHealth = 45
+ health = 45
+
+ harm_intent_damage = 15
+ melee_damage_lower = 20
+ melee_damage_upper = 25
+ attacktext = "blinks at"
+ attack_sound = 'sound/weapons/pierce.ogg'
+
+ faction = list("spooky")
+
+
+/mob/living/simple_animal/hostile/carp/eyeball/FindTarget()
+ . = ..()
+ if(.)
+ emote("me", 1, "glares at [.]")
+
+/mob/living/simple_animal/hostile/carp/eyeball/Die()
+ qdel(src)
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 5753a93cb96..b818475bb03 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -31,7 +31,7 @@
faction = list("faithless")
-/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/faithless/FindTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 09deb6c7ba7..de4d1fd2b3b 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -99,7 +99,7 @@
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
speed = 1
-/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/movement_dir = 0)
return
/mob/living/simple_animal/hostile/syndicate/ranged
@@ -131,7 +131,7 @@
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
speed = 1
-/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0)
+/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/movement_dir = 0)
return
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 0273aee0275..1b720f37540 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -115,8 +115,10 @@
turns_since_move++
if(turns_since_move >= turns_per_move)
if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled
- Move(get_step(src,pick(cardinal)))
- turns_since_move = 0
+ var/anydir = pick(cardinal)
+ if(Process_Spacemove(anydir))
+ Move(get_step(src, anydir), anydir)
+ turns_since_move = 0
//Speaking
if(!client && speak_chance)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a8a5cb65d9b..9e989a38ae7 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -298,6 +298,34 @@ var/list/slot_equipment_priority = list( \
face_atom(A)
A.examine(src)
+//same as above
+/mob/verb/pointed(atom/A as mob|obj|turf in view())
+ set name = "Point To"
+ set category = "Object"
+
+ if(!src || !isturf(src.loc))
+ return
+ if(src.stat || src.restrained())
+ return
+ if(src.status_flags & FAKEDEATH)
+ return
+ if(!(A in view(src.loc)))
+ return
+ if(istype(A, /obj/effect/decal/point))
+ return
+
+ var/tile = get_turf(A)
+ if (!tile)
+ return
+
+ var/obj/P = new /obj/effect/decal/point(tile)
+ spawn (20)
+ if(P)
+ P.loc = null
+
+ usr.visible_message("[src] points to [A]")
+
+
/mob/verb/mode()
set name = "Activate Held Object"
set category = "Object"
@@ -703,7 +731,6 @@ var/list/slot_equipment_priority = list( \
canmove = 1
if(buckled)
lying = 90 * bed
- anchored = buckled
else
if((ko || resting) && !lying)
fall(ko)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index cd9d0a0f0e0..f13d82a7c8e 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -106,8 +106,6 @@
var/coughedtime = null
- var/inertia_dir = 0
-
var/music_lastplayed = "null"
var/job = null//Living
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 5dc9ef9bb79..e0f206cc726 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -86,42 +86,6 @@
return
-/atom/movable/Move(NewLoc, direct)
- if (direct & (direct - 1))
- if (direct & 1)
- if (direct & 4)
- if (step(src, NORTH))
- step(src, EAST)
- else
- if (step(src, EAST))
- step(src, NORTH)
- else
- if (direct & 8)
- if (step(src, NORTH))
- step(src, WEST)
- else
- if (step(src, WEST))
- step(src, NORTH)
- else
- if (direct & 2)
- if (direct & 4)
- if (step(src, SOUTH))
- step(src, EAST)
- else
- if (step(src, EAST))
- step(src, SOUTH)
- else
- if (direct & 8)
- if (step(src, SOUTH))
- step(src, WEST)
- else
- if (step(src, WEST))
- step(src, SOUTH)
- else
- . = ..()
- return
-
-
/client/proc/Move_object(direct)
if(mob && mob.control_object)
if(mob.control_object.density)
@@ -167,15 +131,14 @@
if(!mob.lastarea)
mob.lastarea = get_area(mob.loc)
- if(!has_gravity(mob))
- if(!mob.Process_Spacemove(0))
- return 0
-
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
var/atom/O = mob.loc
return O.relaymove(mob, direct)
+ if(!mob.Process_Spacemove(direct))
+ return 0
+
if(isturf(mob.loc))
if(mob.restrained()) //Why being pulled while cuffed prevents you from moving
@@ -244,6 +207,8 @@
. = ..()
moving = 0
+ if(mob && .)
+ mob.throwing = 0
return .
@@ -342,51 +307,46 @@
///Called by /client/Move()
///For moving in space
///Return 1 for movement 0 for none
-/mob/proc/Process_Spacemove(var/check_drift = 0)
- //First check to see if we can do things
- if(!canmove)
- return 0
+/mob/Process_Spacemove(var/movement_dir = 0)
- if(!isturf(loc)) //if they're in a disposal unit, for example
+ if(..())
return 1
- var/dense_object = 0
- for(var/turf/turf in oview(1,src))
- if(istype(turf,/turf/space))
+ var/atom/movable/dense_object_backup
+ for(var/atom/A in orange(1, get_turf(src)))
+ if(isarea(A))
continue
- if(!turf.density && !mob_negates_gravity())
- continue
+ else if(isturf(A))
+ var/turf/turf = A
+ if(istype(turf,/turf/space))
+ continue
- dense_object++
- break
+ if(!turf.density && !mob_negates_gravity())
+ continue
- if(!dense_object && (locate(/obj/structure/lattice) in oview(1, src)))
- dense_object++
+ return 1
- //Lastly attempt to locate any dense objects we could push off of
- //TODO: If we implement objects drifing in space this needs to really push them
- //Due to a few issues only anchored and dense objects will now work.
- if(!dense_object)
- for(var/obj/O in oview(1, src))
- if((O) && (O.density) && (O.anchored))
- dense_object++
- break
+ else
+ var/atom/movable/AM = A
+ if(AM == buckled) //Kind of unnecessary but let's just be sure
+ continue
+ if(AM.density)
+ if(AM.anchored)
+ if(istype(AM, /obj/item/projectile)) //"You grab the bullet and push off of it!" No
+ continue
+ return 1
+ if(pulling == AM)
+ continue
+ dense_object_backup = AM
- //Nothing to push off of so end here
- if(!dense_object)
- return 0
+ if(movement_dir && dense_object_backup)
+ if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
+ src << "You push off of [dense_object_backup] to propel yourself."
- //Check to see if we slipped
- if(prob(Process_Spaceslipping(5)))
- src << "You slipped!"
- src.inertia_dir = src.last_move
- step(src, src.inertia_dir)
- return 0
- //If not then we can reset inertia and move
- inertia_dir = 0
- return 1
+ return 1
+ return 0
/mob/proc/mob_has_gravity(turf/T)
return has_gravity(src, T)
@@ -394,15 +354,6 @@
/mob/proc/mob_negates_gravity()
return 0
-/mob/proc/Process_Spaceslipping(var/prob_slip = 5)
- //Setup slipage
- //If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such.
- if(stat)
- prob_slip = 0 // Changing this to zero to make it line up with the comment.
-
- prob_slip = round(prob_slip)
- return(prob_slip)
-
/mob/proc/Move_Pulled(var/atom/A)
if (!canmove || restrained() || !pulling)
return
@@ -410,6 +361,10 @@
return
if (!pulling.Adjacent(src))
return
+ if (A == loc && pulling.density)
+ return
+ if (!Process_Spacemove(get_dir(pulling.loc, A)))
+ return
if (ismob(pulling))
var/mob/M = pulling
var/atom/movable/t = M.pulling
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 369c7aea7d3..9108b61c8ea 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -259,10 +259,7 @@
movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
if(current_size >= 9)//The superlarge one does not care about things in its way
- spawn(0)
- step(src, movement_dir)
- spawn(1)
- step(src, movement_dir)
+ step(src, movement_dir)
return 1
else if(check_turfs_in(movement_dir))
last_failed_movement = 0//Reset this because we moved
@@ -407,4 +404,4 @@
var/dist = max((current_size - 2),1)
explosion(src.loc,(dist),(dist*2),(dist*4))
qdel(src)
- return(gain)
\ No newline at end of file
+ return(gain)
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index 652aaf954f6..e99ce0b32eb 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -11,6 +11,7 @@
if(i > 1)
newshot()
user.changeNext_move(CLICK_CD_RANGE)
+ user.newtonian_move(get_dir(target, user))
update_icon()
return 1
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 54338aa0f80..69f63100241 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -137,6 +137,9 @@
else
return 1
+/obj/item/projectile/Process_Spacemove(var/movement_dir = 0)
+ return 1 //Bullets don't drift in space
+
/obj/item/projectile/process()
if(kill_count < 1)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 87b82950be1..ddfb006ba68 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -58,6 +58,7 @@
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
user.changeNext_move(CLICK_CD_RANGE)
+ user.newtonian_move(get_dir(A, user))
if(reagents.has_reagent("sacid"))
message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].")
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 23f5e34ec0a..3f8c1819d04 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -6,6 +6,7 @@
density = 1
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/obj/wrapped = null
+ var/giftwrapped = 0
var/sortTag = 0
@@ -41,12 +42,19 @@
user.visible_message("[user] labels [src] as [str].")
name = "[name] ([str])"
- else if(istype(W, /obj/item/stack/wrapping_paper))
- user.visible_message("[user] wraps the package in festive paper!")
- if(istype(wrapped, /obj/structure/closet/crate))
- icon_state = "giftcrate"
+ else if(istype(W, /obj/item/stack/wrapping_paper) && !giftwrapped)
+ var/obj/item/stack/wrapping_paper/WP = W
+ if(WP.use(3))
+ user.visible_message("[user] wraps the package in festive paper!")
+ giftwrapped = 1
+ if(istype(wrapped, /obj/structure/closet/crate))
+ icon_state = "giftcrate"
+ else
+ icon_state = "giftcloset"
+ if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube
+ new /obj/item/weapon/c_tube( get_turf(user) )
else
- icon_state = "giftcloset"
+ user << "You need more paper."
/obj/item/smallDelivery
@@ -55,11 +63,12 @@
icon = 'icons/obj/storage.dmi'
icon_state = "deliverycrateSmall"
var/obj/item/wrapped = null
+ var/giftwrapped = 0
var/sortTag = 0
/obj/item/smallDelivery/attack_self(mob/user as mob)
- if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0
+ if(wrapped && wrapped.loc) //sometimes items can disappear. For example, bombs. --rastaf0
wrapped.loc = user.loc
if(ishuman(user))
user.put_in_hands(wrapped)
@@ -87,9 +96,17 @@
user.visible_message("[user] labels [src] as [str].")
name = "[name] ([str])"
- else if(istype(W, /obj/item/stack/wrapping_paper))
- icon_state = "giftcrate[wrapped.w_class]"
- user.visible_message("[user] wraps the package in festive paper!")
+ else if(istype(W, /obj/item/stack/wrapping_paper) && !giftwrapped)
+ var/obj/item/stack/wrapping_paper/WP = W
+ if(WP.use(1))
+ icon_state = "giftcrate[wrapped.w_class]"
+ giftwrapped = 1
+ user.visible_message("[user] wraps the package in festive paper!")
+ if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube
+ new /obj/item/weapon/c_tube( get_turf(user) )
+ else
+ user << "You need more paper."
+
/obj/item/stack/packageWrap
@@ -97,8 +114,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "deliveryPaper"
flags = NOBLUDGEON
- w_class = 3.0
amount = 25
+ max_amount = 25
/obj/item/stack/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity)
@@ -113,11 +130,11 @@
if(target in user)
return
- user.attack_log += text("\[[time_stamp()]\] Has used [name] on \ref[target]")
+
if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box)))
var/obj/item/O = target
- if(amount > 1)
+ if(use(1))
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
if(!istype(O.loc, /turf))
if(user.client)
@@ -131,33 +148,41 @@
P.add_fingerprint(usr)
O.add_fingerprint(usr)
add_fingerprint(usr)
- amount -= 1
+ else
+ return
else if(istype(target, /obj/structure/closet/crate))
var/obj/structure/closet/crate/O = target
- if(amount > 3 && !O.opened)
+ if(O.opened)
+ return
+ if(use(3))
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.icon_state = "deliverycrate"
P.wrapped = O
O.loc = P
- amount -= 3
- else if(amount < 3)
+ else
user << "You need more paper."
+ return
else if(istype (target, /obj/structure/closet))
var/obj/structure/closet/O = target
- if(amount > 3 && !O.opened)
+ if(O.opened)
+ return
+ if(use(3))
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.wrapped = O
O.welded = 1
O.loc = P
- amount -= 3
- else if(amount < 3)
+ else
user << "You need more paper."
+ return
else
user << "The object you are trying to wrap is unsuitable for the sorting machinery."
- if(amount <= 0)
- new /obj/item/weapon/c_tube( loc )
- qdel(src)
return
+
+ user.visible_message("[user] wraps [target].")
+ user.attack_log += text("\[[time_stamp()]\] Has used [name] on [target]")
+
+ if(amount <= 0 && !src.loc) //if we used our last wrapping paper, drop a cardboard tube
+ new /obj/item/weapon/c_tube( get_turf(user) )
return
diff --git a/config/admins.txt b/config/admins.txt
index 31a3f30183c..34d7fe5b413 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -65,4 +65,5 @@ paprka = Game Master
cookingboy3 = Game Master
limeliz = Game Master
steelpoint = Game Master
-phil235 = Game Master
\ No newline at end of file
+phil235 = Game Master
+xxnoob = Game Master
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index b3528ac9971..bb75a0bf2cb 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,37 @@
-->
+
+
27 October 2014
+
Jordie0608 updated:
+
+ - Adds a new riot shotgun that spawns in the armory with a 6 round beanbag magazine.
+
+
Paprika updated:
+
+ - Allowed constructs to assist in activating most runes. This includes conversion runes, but does NOT include sacrifice runes.
+
+
Patchouli Knowledge updated:
+
+ - In light of the recent achievements of the Robotics department, new and upgraded exosuit schematics were delivered to SS13 exosuit fabricators as a reward from CentComm.
+ - The countless hours of research, experimentation, and reverse-engineering of wrecks from the mining asteroid have paid off - the Research team has rediscovered the process of building Phazon exosuits. The parts and circuits have been made available in the exofabs and circuit printers.
+ - The APLU Ripley exosuit has been refitted with asteroid mining purposes in mind. Its armour plating will provide extra protection against the brute attacks of asteroid alien lifeforms, and protect from gibtonite explosions. The leg servos were upgraded to provide faster movement.
+ - There are rumours of some creative shaft miners discovering a way of augmenting APLU Ripley armour with trophy hides from goliath-type asteroid lifeforms...
+ - Durand construction routines now require a phasic scanner module and a super capacitor to match Nanotrasen industry standards.
+ - The exosuit fire extinguisher now boasts a larger watertank, and carries a whole 1000u of water from the old 200u tank.
+ - The exosuit plasma converter's efficiency has been vastly improved upon, and its fuel consumption has been cut to nearly half of old values.
+ - The exosuit sleeper interiors have been refitted to allow the occupants more freedom of movement, and the occupants may now eject at will.
+ - The armour plating on all exosuits was fitted with reactive deflection systems specifically designed to stop the rapid slashes from xenomorph threats.
+ - The Firefighter Ripley chassis were moved from the Exosuit Equipment section to the APLU Ripley section of exofab menus.
+ - Fixed some minor errors in the exosuit construction message syntax.
+
+
phil235 updated:
+
+ - Closets and its children can no longer contain a near infinite amount of mobs. Large mobs (juggernaut, alien emperess, etc) don't fit, small mobs (mouse, parrot, etc) still fit in the same amounts, human-sized mob (humanoid, slime, etc) fit but maximum two per body bag and three for all the other closets. Adding bluespace body bag to R&D, it can hold even large mobs and in large amounts.
+ - girders and displaced girders now have a chance to let projectiles pass through them.
+
+
+
19 October 2014
Donkie updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index bce08847b4b..e5ed90c6360 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1992,3 +1992,45 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
to encourage janitors to warn crewmembers about wet floors.
optimumtact:
- rscadd: Medical supplies crate now comes with a boxy full of bodybags
+2014-10-27:
+ Jordie0608:
+ - rscadd: Adds a new riot shotgun that spawns in the armory with a 6 round beanbag
+ magazine.
+ Paprika:
+ - experiment: Allowed constructs to assist in activating most runes. This includes
+ conversion runes, but does NOT include sacrifice runes.
+ Patchouli Knowledge:
+ - rscadd: In light of the recent achievements of the Robotics department, new and
+ upgraded exosuit schematics were delivered to SS13 exosuit fabricators as a
+ reward from CentComm.
+ - rscadd: The countless hours of research, experimentation, and reverse-engineering
+ of wrecks from the mining asteroid have paid off - the Research team has rediscovered
+ the process of building Phazon exosuits. The parts and circuits have been made
+ available in the exofabs and circuit printers.
+ - rscadd: The APLU Ripley exosuit has been refitted with asteroid mining purposes
+ in mind. Its armour plating will provide extra protection against the brute
+ attacks of asteroid alien lifeforms, and protect from gibtonite explosions.
+ The leg servos were upgraded to provide faster movement.
+ - rscadd: There are rumours of some creative shaft miners discovering a way of augmenting
+ APLU Ripley armour with trophy hides from goliath-type asteroid lifeforms...
+ - tweak: Durand construction routines now require a phasic scanner module and a
+ super capacitor to match Nanotrasen industry standards.
+ - tweak: The exosuit fire extinguisher now boasts a larger watertank, and carries
+ a whole 1000u of water from the old 200u tank.
+ - tweak: The exosuit plasma converter's efficiency has been vastly improved upon,
+ and its fuel consumption has been cut to nearly half of old values.
+ - bugfix: The exosuit sleeper interiors have been refitted to allow the occupants
+ more freedom of movement, and the occupants may now eject at will.
+ - bugfix: The armour plating on all exosuits was fitted with reactive deflection
+ systems specifically designed to stop the rapid slashes from xenomorph threats.
+ - bugfix: The Firefighter Ripley chassis were moved from the Exosuit Equipment section
+ to the APLU Ripley section of exofab menus.
+ - spellcheck: Fixed some minor errors in the exosuit construction message syntax.
+ phil235:
+ - rscadd: Closets and its children can no longer contain a near infinite amount
+ of mobs. Large mobs (juggernaut, alien emperess, etc) don't fit, small mobs
+ (mouse, parrot, etc) still fit in the same amounts, human-sized mob (humanoid,
+ slime, etc) fit but maximum two per body bag and three for all the other closets.
+ Adding bluespace body bag to R&D, it can hold even large mobs and in large amounts.
+ - experiment: girders and displaced girders now have a chance to let projectiles
+ pass through them.
diff --git a/html/changelogs/Jordie0608-PR-5231.yml b/html/changelogs/Jordie0608-PR-5231.yml
deleted file mode 100644
index 037185af189..00000000000
--- a/html/changelogs/Jordie0608-PR-5231.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Jordie0608
-
-delete-after: True
-
-changes:
- - rscadd: Adds a new riot shotgun that spawns in the armory with a 6 round beanbag magazine.
\ No newline at end of file
diff --git a/html/changelogs/MrPerson.yml b/html/changelogs/MrPerson.yml
index 6378584f30e..4f610d483e2 100644
--- a/html/changelogs/MrPerson.yml
+++ b/html/changelogs/MrPerson.yml
@@ -1,2 +1,8 @@
author: MrPerson
-changes: []
+changes:
+ - rscadd: "Everything now drifts in space, not just mobs."
+ - rscadd: "Mechs are just as maneuverable in space as you are."
+ - tweak: "Being weightless now slows movement down by a lot rather than speeding it up. Having your hands full will make movement even slower."
+ - rscdel: "Removed spaceslipping (You slipped! x1000)"
+ - bugfix: "Jetpacking after being thrown out a mass driver will cancel out your momentum."
+ - bugfix: "Shooting a gun causes you to drift the other direction like spraying a fire extinguisher."
\ No newline at end of file
diff --git a/html/changelogs/Paprka-PR-5179.yml b/html/changelogs/Paprka-PR-5179.yml
deleted file mode 100644
index 09edf6384ea..00000000000
--- a/html/changelogs/Paprka-PR-5179.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Paprika
-delete-after: True
-changes:
- - experiment: "Allowed constructs to assist in activating most runes. This includes conversion runes, but does NOT include sacrifice runes."
\ No newline at end of file
diff --git a/html/changelogs/Patchi-mechs-phazons.yml b/html/changelogs/Patchi-mechs-phazons.yml
deleted file mode 100644
index 7990ef7ea6d..00000000000
--- a/html/changelogs/Patchi-mechs-phazons.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-author: Patchouli Knowledge
-delete-after: true
-changes:
- - rscadd: "In light of the recent achievements of the Robotics department, new and upgraded exosuit schematics were delivered to SS13 exosuit fabricators as a reward from CentComm.
- - rscadd: "The countless hours of research, experimentation, and reverse-engineering of wrecks from the mining asteroid have paid off - the Research team has rediscovered the process of building Phazon exosuits. The parts and circuits have been made available in the exofabs and circuit printers."
- - rscadd: "The APLU Ripley exosuit has been refitted with asteroid mining purposes in mind. Its armour plating will provide extra protection against the brute attacks of asteroid alien lifeforms, and protect from gibtonite explosions. The leg servos were upgraded to provide faster movement."
- - rscadd: "There are rumours of some creative shaft miners discovering a way of augmenting APLU Ripley armour with trophy hides from goliath-type asteroid lifeforms..."
- - tweak: "Durand construction routines now require a phasic scanner module and a super capacitor to match Nanotrasen industry standards."
- - tweak: "The exosuit fire extinguisher now boasts a larger watertank, and carries a whole 1000u of water from the old 200u tank."
- - tweak: "The exosuit plasma converter's efficiency has been vastly improved upon, and its fuel consumption has been cut to nearly half of old values."
- - bugfix: "The exosuit sleeper interiors have been refitted to allow the occupants more freedom of movement, and the occupants may now eject at will.
- - bugfix: "The armour plating on all exosuits was fitted with reactive deflection systems specifically designed to stop the rapid slashes from xenomorph threats."
- - bugfix: "The Firefighter Ripley chassis were moved from the Exosuit Equipment section to the APLU Ripley section of exofab menus."
- - spellcheck: "Fixed some minor errors in the exosuit construction message syntax."
\ No newline at end of file
diff --git a/html/changelogs/phil235-PR-5216.yml b/html/changelogs/phil235-PR-5216.yml
deleted file mode 100644
index acb18141530..00000000000
--- a/html/changelogs/phil235-PR-5216.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: phil235
-delete-after: True
-changes:
- - rscadd: "Closets and its children can no longer contain a near infinite amount of mobs. Large mobs (juggernaut, alien emperess, etc) don't fit, small mobs (mouse, parrot, etc) still fit in the same amounts, human-sized mob (humanoid, slime, etc) fit but maximum two per body bag and three for all the other closets. Adding bluespace body bag to R&D, it can hold even large mobs and in large amounts."
\ No newline at end of file
diff --git a/html/changelogs/phil235-PR-5249.yml b/html/changelogs/phil235-PR-5249.yml
deleted file mode 100644
index 1a93df0ddf6..00000000000
--- a/html/changelogs/phil235-PR-5249.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: phil235
-delete-after: True
-changes:
- - experiment: "girders and displaced girders now have a chance to let projectiles pass through them."
\ No newline at end of file
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 6466f049aed..0547d648086 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 64d5b519ad0..41b93e38b63 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index 8b586b4fab9..ff3073b2ddd 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi
index 7b559aad634..7039ec43103 100644
Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 11520ec0f35..602df9fc9d0 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/halloween_items.dmi b/icons/obj/halloween_items.dmi
new file mode 100644
index 00000000000..c08ea711488
Binary files /dev/null and b/icons/obj/halloween_items.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 7c4e43a241c..c03fa5e244e 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index ed57a390a27..042bda052f6 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/meteor_spooky.dmi b/icons/obj/meteor_spooky.dmi
new file mode 100644
index 00000000000..287d5b47bd0
Binary files /dev/null and b/icons/obj/meteor_spooky.dmi differ
diff --git a/icons/pda_icons/pda_cleanbot.png b/icons/pda_icons/pda_cleanbot.png
new file mode 100644
index 00000000000..cecbcf40773
Binary files /dev/null and b/icons/pda_icons/pda_cleanbot.png differ
diff --git a/icons/pda_icons/pda_floorbot.png b/icons/pda_icons/pda_floorbot.png
new file mode 100644
index 00000000000..999e45aed25
Binary files /dev/null and b/icons/pda_icons/pda_floorbot.png differ
diff --git a/icons/pda_icons/pda_medbot.png b/icons/pda_icons/pda_medbot.png
new file mode 100644
index 00000000000..24ae212be2e
Binary files /dev/null and b/icons/pda_icons/pda_medbot.png differ
diff --git a/sound/spookoween/bats.ogg b/sound/spookoween/bats.ogg
new file mode 100644
index 00000000000..fb428debcb3
Binary files /dev/null and b/sound/spookoween/bats.ogg differ
diff --git a/sound/spookoween/chain_rattling.ogg b/sound/spookoween/chain_rattling.ogg
new file mode 100644
index 00000000000..9ff9913b2b2
Binary files /dev/null and b/sound/spookoween/chain_rattling.ogg differ
diff --git a/sound/spookoween/ghost_whisper.ogg b/sound/spookoween/ghost_whisper.ogg
new file mode 100644
index 00000000000..660b04c786d
Binary files /dev/null and b/sound/spookoween/ghost_whisper.ogg differ
diff --git a/sound/spookoween/ghosty_wind.ogg b/sound/spookoween/ghosty_wind.ogg
new file mode 100644
index 00000000000..b1c8c2f3a8c
Binary files /dev/null and b/sound/spookoween/ghosty_wind.ogg differ
diff --git a/sound/spookoween/girlscream.ogg b/sound/spookoween/girlscream.ogg
new file mode 100644
index 00000000000..8ded518f47f
Binary files /dev/null and b/sound/spookoween/girlscream.ogg differ
diff --git a/sound/spookoween/insane_low_laugh.ogg b/sound/spookoween/insane_low_laugh.ogg
new file mode 100644
index 00000000000..6f1ba277783
Binary files /dev/null and b/sound/spookoween/insane_low_laugh.ogg differ
diff --git a/sound/spookoween/scary_clown_appear.ogg b/sound/spookoween/scary_clown_appear.ogg
new file mode 100644
index 00000000000..05ab18f70b0
Binary files /dev/null and b/sound/spookoween/scary_clown_appear.ogg differ
diff --git a/sound/spookoween/scary_horn.ogg b/sound/spookoween/scary_horn.ogg
new file mode 100644
index 00000000000..a0b05821bb2
Binary files /dev/null and b/sound/spookoween/scary_horn.ogg differ
diff --git a/sound/spookoween/scary_horn2.ogg b/sound/spookoween/scary_horn2.ogg
new file mode 100644
index 00000000000..fb2805bd2cd
Binary files /dev/null and b/sound/spookoween/scary_horn2.ogg differ
diff --git a/sound/spookoween/scary_horn3.ogg b/sound/spookoween/scary_horn3.ogg
new file mode 100644
index 00000000000..0aaefe1583a
Binary files /dev/null and b/sound/spookoween/scary_horn3.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index fbfeef2b539..32a302e49de 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1113,6 +1113,7 @@
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
#include "code\modules\mob\living\simple_animal\hostile\creature.dm"
+#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"