From d703f5636030e573311e9bc22488d5ee75d313e9 Mon Sep 17 00:00:00 2001 From: Oreolek Date: Thu, 3 Dec 2015 12:06:22 +0700 Subject: [PATCH] Trick shots! --- Gulpfile.js | 2 +- game/en.coffee | 42 ++++++++++++++++++++-------- game/main.coffee | 72 ++++++++++++++++++++++++++++++++---------------- game/ru.coffee | 22 +++++++++++++-- html/en.html | 2 -- 5 files changed, 98 insertions(+), 42 deletions(-) diff --git a/Gulpfile.js b/Gulpfile.js index 1f10bce..e508469 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -132,7 +132,7 @@ gulp.task('undum-dist', function () { gulp.task('html-dist', html('./dist')); gulp.task('img-dist', img('./dist/img')); -gulp.task('audio-dist', img('./dist/audio')); +gulp.task('audio-dist', audio('./dist/audio')); gulp.task('less-dist', function () { return gulp.src('./less/main.less') diff --git a/game/en.coffee b/game/en.coffee index e194570..9924d24 100644 --- a/game/en.coffee +++ b/game/en.coffee @@ -10,22 +10,22 @@ module.exports.language = """ androidattack: "One of androids is so close he bites me!" emptyclip: "I get rid of empty cartridge." - player_hit:[ + player_hit: [ "Android's head explodes like a Christmas fireworks.", "Android tries to dodge but finds himself right on the bullet's wrong side. He falls, flooding the floor with oil." ] - player_finished:[ + player_finished: [ "I finish the android with a shot to his heart.", "I finish the android with a precise shot.", "The bullet pierces android's head and he finally falls on the floor motionless.", ] - player_nicked:[ + player_nicked: [ """I shoot the enemy's leg off. He falls but keeps slowly scratch his way with his hands.""", "I shoot through the android's arm. He stumbles but keeps going.", ] - shoot:[ + shoot: [ "Shoot", "BAM!", "BLAM!", @@ -42,7 +42,6 @@ module.exports.language = "Send a bullet to android", "Send a bullet with explosion", "Push the trigger FOR THE HUMANITY", - "Jump to a wall and shoot while flying", "Sit down and shoot from a hip", "Take the pistol in both hands and push the trigger", "Slowly take aim and shoot", @@ -53,7 +52,7 @@ module.exports.language = I hope it has some ammo. """ search: "Search for a clip" - search_response:[ + search_response: [ "I hastily search the floor, trying to find at least one cartridge intact.", "I quickly look around for a clip on the floor.", ] @@ -92,20 +91,39 @@ module.exports.language = * watupgroupie - [gunshots.mp3](http://freesound.org/people/watupgroupie/sounds/36815/) * qubodup - [Bullet silhoettes](https://openclipart.org/detail/29029/bullet-silhouettes) """ - clips_not_found:[ + clips_not_found: [ "No, nothing here.", - "Come on, at least one! No, didn't find any." + "Come on, at least one! No, didn't find any.", ] - health: 'Health' enemies: 'Enemies ahead' clips: 'Cartridges' bullets: 'Bullets in clip' - clips_found:[ - "Aha! Got one. I hope it has some ammo.", + clips_found: [ + 'Aha! Got one. I hope it has some ammo.', "Eh, here's one. Looks heavy -- I hope it has some ammo.", ] - player_missed:[ + player_missed: [ "The bullet flies over android's left arm.", "Android dodges the shot. It's alright, next time I won't miss.", "Damn! Missed.", ] + trick_shot: "Try a trick shot" + player_trickshot: [ + " + I run against a wall and jump, shooting while flying. + The bullet flies through android's head into another one, knocking them both out. + ", + " + I notice a weak spot in the ceiling. + A single shot there - and a section collapses, taking two enemies out. + ", + ] + trick_shot_discover: (character) -> + """ + I count the clips. + Only four left. + I've killed #{character.sandbox.killed} androids, meaning, there are still... oh. + OH. + I gotta conserve the ammo. + I can try trick shots but these are big risk. + """ diff --git a/game/main.coffee b/game/main.coffee index a1de49d..796d55d 100644 --- a/game/main.coffee +++ b/game/main.coffee @@ -40,6 +40,16 @@ Array.prototype.oneOf = () -> # a) remove bullet counter (you don't know how many bullets left in a clip) # b) remove canChoose restriction (you can shoot any time you want, but if you have no bullets - nothing comes out and you've lost a turn) +kill_enemy = (character, system) -> + if character.qualities.enemies == 0 + return + character.sandbox.nicked = 0 + character.sandbox.killed++ + if character.qualities.enemies >= 1 + system.setQuality("enemies", character.qualities.enemies - 1) + if character.qualities.enemies == 0 + system.doLink("finale") + spend_bullet = (character, system) -> bullets = character.sandbox.clips[character.sandbox.current_clip] character.sandbox.shots++ @@ -77,11 +87,6 @@ spend_clip = (character, system) -> system.setQuality("bullets", bullets) $("#clip img").attr("src", "img/clip"+bullets+".png") -check_distance = (character, system) -> - if character.sandbox.distance == 0 - system.setQuality("health", character.qualities.health - 1) - system.writemd("androidattack".l()) - situation 'start', content: "intro".l(), choices: ["#shoot"], @@ -92,18 +97,13 @@ situation "hit", return response() choices: ["#shoot"] before: (character, system, from) -> - character.sandbox.nicked = 0 - if character.qualities.enemies > 1 - system.setQuality("enemies", character.qualities.enemies - 1) - if character.qualities.enemies == 0 - system.doLink("finale") + kill_enemy(character, system) choices: ["#shoot"] situation "nicked", content: (character, system, from) -> if character.sandbox.nicked == 1 - system.setQuality("enemies", character.qualities.enemies - 1) - character.sandbox.nicked = 0 + kill_enemy(character, system) response = "player_finished".l().oneOf().randomly(system) return response() else @@ -118,6 +118,15 @@ situation "miss", return response() choices: ["#shoot"] +situation "trick", + before: (character, system, from) -> + kill_enemy(character, system) + kill_enemy(character, system) + content: (character, system, from) -> + response = "player_trickshot".l().oneOf().randomly(system) + return response() + choices: ["#shoot"] + situation "shoot", tags: ["shoot"], optionText: (character, system, from) -> @@ -126,19 +135,38 @@ situation "shoot", return character.qualities.bullets > 0 before: (character, system, from) -> spend_bullet(character, system) - character.sandbox.distance = 3 system.clearContent() after: (character, system, from) -> roll = system.rnd.dice(1,20) # d20 roll hit_threshold = 15 miss_threshold = 18 - if character.qualities.health < 2 - hit_threshold = 18 switch when roll < hit_threshold then system.doLink("hit") when roll > miss_threshold then system.doLink("miss") else system.doLink("nicked") +situation "trick_shot", + tags: ["shoot"], + optionText: (character, system, from) -> + return "trick_shot".l() + canView: (character, system) -> + return character.sandbox.trick_shot == 1 + canChoose: (character, system) -> + return character.qualities.bullets > 0 + before: (character, system, from) -> + spend_bullet(character, system) + system.clearContent() + after: (character, system, from) -> + roll = system.rnd.dice(1,20) # d20 roll + trick_threshold = 5 + hit_threshold = 12 + miss_threshold = 16 + switch + when roll < trick_threshold then system.doLink("trick") + when roll < hit_threshold then system.doLink("hit") + when roll > miss_threshold then system.doLink("miss") + else system.doLink("nicked") + situation "reload", tags: ["shoot"], choices: ["#shoot"], @@ -150,10 +178,12 @@ situation "reload", before: (character, system) -> character.sandbox.seen_reload = 1 system.clearContent() - character.sandbox.distance-- after: (character, system) -> spend_clip(character, system) writemd(system, "reload_response".l()) + if character.sandbox.trick_shot == 0 and character.sandbox.clips.length == 4 + character.sandbox.trick_shot = 1 + writemd(system, "trick_shot_discover".l()(character)) return true situation "search", @@ -166,16 +196,11 @@ situation "search", before: (character, system) -> system.clearContent() character.sandbox.seen_search = 1 - character.sandbox.distance-- after: (character, system) -> response = "search_response".l().oneOf().randomly(system) writemd(system, response()) roll = system.rnd.dice(1,20) # d20 roll find_threshold = 10 - if character.qualities.health < 2 - find_threshold += 2 - if character.sandbox.distance < 2 - find_threshold += 2 if roll < find_threshold system.doLink("found") else @@ -208,20 +233,19 @@ qualities bullets: qualities.integer("bullets".l()), clips: qualities.integer("clips".l()), enemies: qualities.integer("enemies".l()), - health: qualities.fudgeAdjectives("health".l()), undum.game.init = (character, system) -> system.setQuality("bullets", 6) system.setQuality("clips", 6) system.setQuality("enemies", 35) - system.setQuality("health", 3) character.sandbox.clips = [6,6,6,6,6,6] character.sandbox.current_clip = 0 character.sandbox.nicked = 0 - character.sandbox.distance = 3 character.sandbox.seen_reload = 0 character.sandbox.seen_search = 0 + character.sandbox.trick_shot = 0 character.sandbox.shots = 0 + character.sandbox.killed = 0 $("#title").click(() -> $("#clip").fadeIn() ) diff --git a/game/ru.coffee b/game/ru.coffee index c9a8cda..716e7c4 100644 --- a/game/ru.coffee +++ b/game/ru.coffee @@ -12,7 +12,6 @@ module.exports.language = link_not_valid: "Ссылка '{link}' не выглядит правильной." link_no_action: "Ссылка с ситуацией '.' должна иметь действие." unknown_situation: "Вы не можете переместиться в неизвестную ситуацию {id}." - erase_message: "Это навсегда удалит вашего персонажа и немедленно вернёт вас к началу игры. Вы уверены?" no_current_situation: "Я не могу отобразить, потому что у нас нет текущей ситуации." no_local_storage: "Локальное хранилище недоступно." random_seed_error: "Вы должны задать верное случайное зерно." @@ -73,7 +72,7 @@ module.exports.language = finale: """ Ба-бах! - + Последний андроид внезапно взрывается, как будто нашпигованный динамитом. А, впрочем, с этими машинами никогда не знаешь наверняка. Я отворачиваюсь и ухожу прочь, не обращая внимания на взрыв. @@ -110,7 +109,6 @@ module.exports.language = "Нет, ничего нет.", "Ну хотя бы один! Нет, не нашёл." ] - health: 'Здоровье' enemies: 'Врагов впереди' clips: 'Картриджей с патронами' bullets: 'Патронов в картридже' @@ -123,3 +121,21 @@ module.exports.language = "Андроид вовремя уворачивается от выстрела. Ничего, в следующий раз я не промахнусь.", "Чёрт! Промазал." ] + trick_shot: "Попробовать хитрый выстрел", + trick_shot_discover: (character) -> + """ + Я пересчитываю картриджи. + Осталось всего четыре. + Я убил #{character.sandbox.killed} андроидов, то есть, впереди ещё... ой. + ОЙ. + Надо экономить патроны. + Я могу попробовать хитрые выстрелы, но это -- большой риск. + """ + player_trickshot: [ + """Я разбегаюсь к стене и прыгаю, стреляя в полёте. + Пуля пролетает сквозь голову андроида прямо в следующего, вырубая обоих. + """, + """Я замечаю слабое место в потолке. + Один выстрел туда -- и секция разваливается, убирая под собой двух врагов. + """ + ] diff --git a/html/en.html b/html/en.html index a9c53f9..4e42c46 100644 --- a/html/en.html +++ b/html/en.html @@ -17,7 +17,6 @@

Thirty five shots

An online sci-fi first person cybertext shooter

-

by Oreolek

@@ -35,7 +34,6 @@