From 2c78f7122c0804717700b9be0814e77b80934fed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Sep 2017 22:31:07 -0500 Subject: [PATCH] [MIRROR] Adds some new plushies (#2866) * Adds some new plushies * Update packs.dm --- code/game/objects/items/plushes.dm | 34 +- code/game/objects/items/toys.dm | 2 +- code/modules/cargo/packs.dm | 4 + .../living/silicon/ai/freelook/cameranet.dm | 322 +++++++++--------- icons/obj/plushes.dmi | Bin 3736 -> 5362 bytes 5 files changed, 199 insertions(+), 163 deletions(-) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 778655d4b0..b22383ad58 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -39,4 +39,36 @@ /obj/item/toy/plush/narplush name = "nar'sie plushie" desc = "A small stuffed doll of the elder god nar'sie. Who thought this was a good children's toy?" - icon_state = "narplush" \ No newline at end of file + icon_state = "narplush" + +/obj/item/toy/plush/lizardplushie + name = "lizard plushie" + desc = "An adorable stuffed toy that resembles a lizardperson." + icon_state = "plushie_lizard" + item_state = "plushie_lizard" + attack_verb = list("clawed", "hissed", "tail slapped") + squeak_override = list('sound/weapons/slash.ogg' = 1) + +/obj/item/toy/plush/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + attack_verb = list("bitten", "hissed", "tail slapped") + squeak_override = list('sound/weapons/bite.ogg' = 1) + +/obj/item/toy/plush/nukeplushie + name = "operative plushie" + desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." + icon_state = "plushie_nuke" + item_state = "plushie_nuke" + attack_verb = list("shot", "nuked", "detonated") + squeak_override = list('sound/effects/hit_punch.ogg' = 1) + +/obj/item/toy/plush/slimeplushie + name = "slime plushie" + desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack." + icon_state = "plushie_slime" + item_state = "plushie_slime" + attack_verb = list("blorbled", "slimed", "absorbed") + squeak_override = list('sound/effects/blobattack.ogg' = 1) \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a918fe494a..a683902a6c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -39,7 +39,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "waterballoon-e" item_state = "balloon-empty" - + /obj/item/toy/balloon/New() create_reagents(10) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index bfe0c8e776..c5b180d8a1 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1644,6 +1644,10 @@ /obj/item/toy/nuke, /obj/item/toy/minimeteor, /obj/item/toy/plush/carpplushie, + /obj/item/toy/plush/lizardplushie, + /obj/item/toy/plush/snakeplushie, + /obj/item/toy/plush/nukeplushie, + /obj/item/toy/plush/slimeplushie, /obj/item/coin/antagtoken, /obj/item/stack/tile/fakespace/loaded, /obj/item/gun/ballistic/shotgun/toy/crossbow, diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 6624b75fd5..812e207249 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -1,161 +1,161 @@ -// CAMERA NET -// -// The datum containing all the chunks. - -#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. - -GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) - -/datum/cameranet - var/name = "Camera Net" // Name to show for VV and stat() - - // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/cameras = list() - // The chunks of the map, mapping the areas that the cameras can see. - var/list/chunks = list() - var/ready = 0 - - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick - -// Checks if a chunk has been Generated in x, y, z. -/datum/cameranet/proc/chunkGenerated(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" - return (chunks[key]) - -// Returns the chunk in the x, y, z. -// If there is no chunk, it creates a new chunk and returns that. -/datum/cameranet/proc/getCameraChunk(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" - if(!chunks[key]) - chunks[key] = new /datum/camerachunk(null, x, y, z) - - return chunks[key] - -// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. - -/datum/cameranet/proc/visibility(mob/camera/aiEye/ai) - // 0xf = 15 - var/x1 = max(0, ai.x - 16) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, ai.y - 16) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, ai.x + 16) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, ai.y + 16) & ~(CHUNK_SIZE - 1) - - var/list/visibleChunks = list() - - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, ai.z) - - var/list/remove = ai.visibleCameraChunks - visibleChunks - var/list/add = visibleChunks - ai.visibleCameraChunks - - for(var/chunk in remove) - var/datum/camerachunk/c = chunk - c.remove(ai) - - for(var/chunk in add) - var/datum/camerachunk/c = chunk - c.add(ai) - -// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. - -/datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - - if(!SSticker || (opacity_check && !A.opacity)) - return - majorChunkChange(A, 2) - -/datum/cameranet/proc/updateChunk(x, y, z) - // 0xf = 15 - if(!chunkGenerated(x, y, z)) - return - var/datum/camerachunk/chunk = getCameraChunk(x, y, z) - chunk.hasChanged() - -// Removes a camera from a chunk. - -/datum/cameranet/proc/removeCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 0) - -// Add a camera to a chunk. - -/datum/cameranet/proc/addCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) - -// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. - -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) - //else - // majorChunkChange(c, 0) - -// Never access this proc directly!!!! -// This will update the chunk and all the surrounding chunks. -// It will also add the atom to the cameras list if you set the choice to 1. -// Setting the choice to 0 will remove the camera from the chunks. -// If you want to update the chunks around an object, without adding/removing a camera, use choice 2. - -/datum/cameranet/proc/majorChunkChange(atom/c, choice) - // 0xf = 15 - if(!c) - return - - var/turf/T = get_turf(c) - if(T) - var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - if(chunkGenerated(x, y, T.z)) - var/datum/camerachunk/chunk = getCameraChunk(x, y, T.z) - if(choice == 0) - // Remove the camera. - chunk.cameras -= c - else if(choice == 1) - // You can't have the same camera in the list twice. - chunk.cameras |= c - chunk.hasChanged() - -// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. - -/datum/cameranet/proc/checkCameraVis(mob/living/target) - - // 0xf = 15 - var/turf/position = get_turf(target) - return checkTurfVis(position) - - -/datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) - if(chunk) - if(chunk.changed) - chunk.hasChanged(1) // Update now, no matter if it's visible or not. - if(chunk.visibleTurfs[position]) - return 1 - return 0 - -/datum/cameranet/proc/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) - -// Debug verb for VVing the chunk that the turf is in. -/* -/turf/verb/view_chunk() - set src in world - - if(cameranet.chunkGenerated(x, y, z)) - var/datum/camerachunk/chunk = cameranet.getCameraChunk(x, y, z) - usr.client.debug_variables(chunk) -*/ +// CAMERA NET +// +// The datum containing all the chunks. + +#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. + +GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) + +/datum/cameranet + var/name = "Camera Net" // Name to show for VV and stat() + + // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). + var/list/cameras = list() + // The chunks of the map, mapping the areas that the cameras can see. + var/list/chunks = list() + var/ready = 0 + + // The object used for the clickable stat() button. + var/obj/effect/statclick/statclick + +// Checks if a chunk has been Generated in x, y, z. +/datum/cameranet/proc/chunkGenerated(x, y, z) + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) + var/key = "[x],[y],[z]" + return (chunks[key]) + +// Returns the chunk in the x, y, z. +// If there is no chunk, it creates a new chunk and returns that. +/datum/cameranet/proc/getCameraChunk(x, y, z) + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) + var/key = "[x],[y],[z]" + if(!chunks[key]) + chunks[key] = new /datum/camerachunk(null, x, y, z) + + return chunks[key] + +// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. + +/datum/cameranet/proc/visibility(mob/camera/aiEye/ai) + // 0xf = 15 + var/x1 = max(0, ai.x - 16) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, ai.y - 16) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, ai.x + 16) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, ai.y + 16) & ~(CHUNK_SIZE - 1) + + var/list/visibleChunks = list() + + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + visibleChunks |= getCameraChunk(x, y, ai.z) + + var/list/remove = ai.visibleCameraChunks - visibleChunks + var/list/add = visibleChunks - ai.visibleCameraChunks + + for(var/chunk in remove) + var/datum/camerachunk/c = chunk + c.remove(ai) + + for(var/chunk in add) + var/datum/camerachunk/c = chunk + c.add(ai) + +// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. + +/datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) + + if(!SSticker || (opacity_check && !A.opacity)) + return + majorChunkChange(A, 2) + +/datum/cameranet/proc/updateChunk(x, y, z) + // 0xf = 15 + if(!chunkGenerated(x, y, z)) + return + var/datum/camerachunk/chunk = getCameraChunk(x, y, z) + chunk.hasChanged() + +// Removes a camera from a chunk. + +/datum/cameranet/proc/removeCamera(obj/machinery/camera/c) + if(c.can_use()) + majorChunkChange(c, 0) + +// Add a camera to a chunk. + +/datum/cameranet/proc/addCamera(obj/machinery/camera/c) + if(c.can_use()) + majorChunkChange(c, 1) + +// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. + +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) + if(c.can_use()) + majorChunkChange(c, 1) + //else + // majorChunkChange(c, 0) + +// Never access this proc directly!!!! +// This will update the chunk and all the surrounding chunks. +// It will also add the atom to the cameras list if you set the choice to 1. +// Setting the choice to 0 will remove the camera from the chunks. +// If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + +/datum/cameranet/proc/majorChunkChange(atom/c, choice) + // 0xf = 15 + if(!c) + return + + var/turf/T = get_turf(c) + if(T) + var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + if(chunkGenerated(x, y, T.z)) + var/datum/camerachunk/chunk = getCameraChunk(x, y, T.z) + if(choice == 0) + // Remove the camera. + chunk.cameras -= c + else if(choice == 1) + // You can't have the same camera in the list twice. + chunk.cameras |= c + chunk.hasChanged() + +// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. + +/datum/cameranet/proc/checkCameraVis(mob/living/target) + + // 0xf = 15 + var/turf/position = get_turf(target) + return checkTurfVis(position) + + +/datum/cameranet/proc/checkTurfVis(turf/position) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(chunk) + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return 1 + return 0 + +/datum/cameranet/proc/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) + +// Debug verb for VVing the chunk that the turf is in. +/* +/turf/verb/view_chunk() + set src in world + + if(cameranet.chunkGenerated(x, y, z)) + var/datum/camerachunk/chunk = cameranet.getCameraChunk(x, y, z) + usr.client.debug_variables(chunk) +*/ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index 6a7b21efec060a084f049312277207777835d421..f0eb8175497e73f02a005bfd6b4ac1994a187c73 100644 GIT binary patch literal 5362 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 EKfCB~!vFvP literal 3736 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