This commit is contained in:
Scott Erickson 2014-03-19 19:43:55 -07:00
commit 034a18c960
13 changed files with 1213 additions and 1206 deletions

View file

@ -22,6 +22,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
healthBar: null
marks: null
labels: null
ranges: null
options:
resolutionFactor: 4
@ -62,6 +63,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@actionQueue = []
@marks = {}
@labels = {}
@ranges = []
@handledAoEs = {}
@age = 0
@scaleFactor = @targetScaleFactor = 1
@ -250,6 +252,12 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
return
scaleX = if @getActionProp 'flipX' then -1 else 1
scaleY = if @getActionProp 'flipY' then -1 else 1
if @thangType.get('name') is 'Arrow'
# scale the arrow so it appears longer when flying parallel to horizon
angle = @getRotation()
angle = -angle if angle < 0
angle = 180 - angle if angle > 90
scaleX = 0.5 + 0.5 * (90 - angle) / 90
scaleFactorX = @thang.scaleFactorX ? @scaleFactor
scaleFactorY = @thang.scaleFactorY ? @scaleFactor
@imageObject.scaleX = @originalScaleX * scaleX * scaleFactorX
@ -425,9 +433,17 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
allProps = allProps.concat (@thang.programmableProperties ? [])
allProps = allProps.concat (@thang.moreProgrammableProperties ? [])
@addMark('voiceradius') if 'voiceRange' in allProps
@addMark('visualradius') if 'visualRange' in allProps
@addMark('attackradius') if 'attackRange' in allProps
for property in allProps
if m = property.match /.*Range$/
if @thang[m[0]]? and @thang[m[0]] < 9001
@ranges.push
name: m[0]
radius: @thang[m[0]]
@ranges = _.sortBy @ranges, 'radius'
@ranges.reverse()
@addMark range.name for range in @ranges
@addMark('bounds').toggle true if @thang?.drawsBounds
@addMark('shadow').toggle true unless @thangType.get('shadow') is 0
@ -438,13 +454,9 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@marks.repair?.toggle @thang?.errorsOut
if @selected
@marks.voiceradius?.toggle true
@marks.visualradius?.toggle true
@marks.attackradius?.toggle true
@marks[range['name']].toggle true for range in @ranges
else
@marks.voiceradius?.toggle false
@marks.visualradius?.toggle false
@marks.attackradius?.toggle false
@marks[range['name']].toggle false for range in @ranges
mark.update() for name, mark of @marks
#@thang.effectNames = ['berserk', 'confuse', 'control', 'curse', 'fear', 'poison', 'paralyze', 'regen', 'sleep', 'slow', 'haste']

View file

@ -55,9 +55,7 @@ module.exports = class Mark extends CocoClass
if @name is 'bounds' then @buildBounds()
else if @name is 'shadow' then @buildShadow()
else if @name is 'debug' then @buildDebug()
else if @name is 'voiceradius' then @buildRadius('voice')
else if @name is 'visualradius' then @buildRadius('visual')
else if @name is 'attackradius' then @buildRadius('attack')
else if @name.match(".*Range$") then @buildRadius(@name)
else if @thangType then @buildSprite()
else console.error "Don't know how to build mark for", @name
@mark?.mouseEnabled = false
@ -117,51 +115,40 @@ module.exports = class Mark extends CocoClass
@mark.layerIndex = 10
#@mark.cache 0, 0, diameter, diameter # not actually faster than simple ellipse draw
buildRadius: (type) ->
return if type is 'voice' and @sprite.thang.voiceRange > 9000
return if type is 'visual' and @sprite.thang.visualRange > 9000
return if type is 'attack' and @sprite.thang.attackRange > 9000
buildRadius: (range) ->
alpha = 0.35
colors =
voice: "rgba(0, 145, 0, alpha)"
visual: "rgba(0, 0, 145, alpha)"
attack: "rgba(145, 0, 0, alpha)"
voiceRange: "rgba(0, 145, 0, #{alpha})"
visualRange: "rgba(0, 0, 145, #{alpha})"
attackRange: "rgba(145, 0, 0, #{alpha})"
color = colors[type]
# Fallback colors which work on both dungeon and grass tiles
extracolors = [
"rgba(145, 0, 145, #{alpha})"
"rgba(0, 145, 145, #{alpha})"
"rgba(145, 105, 0, #{alpha})"
"rgba(225, 125, 0, #{alpha})"
]
# Find the index of this range, to find the next-smallest radius
rangeNames = @sprite.ranges.map((range, index) ->
range['name']
)
i = rangeNames.indexOf(range)
@mark = new createjs.Shape()
@mark.graphics.beginFill color.replace('alpha', 0.4)
if type is 'voice'
r = @sprite.thang.voiceRange
ranges = [
r,
if 'visualradius' of @sprite.marks and @sprite.thang.visualRange < 9001 then @sprite.thang.visualRange else 0,
if 'attackradius' of @sprite.marks and @sprite.thang.attackRange < 9001 then @sprite.thang.attackRange else 0
]
else if type is 'visual'
r = @sprite.thang.visualRange
ranges = [
r,
if 'attackradius' of @sprite.marks and @sprite.thang.attackRange < 9001 then @sprite.thang.attackRange else 0,
if 'voiceradius' of @sprite.marks and @sprite.thang.voiceRange < 9001 then @sprite.thang.voiceRange else 0,
]
else if type is 'attack'
r = @sprite.thang.attackRange
ranges = [
r,
if 'voiceradius' of @sprite.marks and @sprite.thang.voiceRange < 9001 then @sprite.thang.voiceRange else 0,
if 'visualradius' of @sprite.marks and @sprite.thang.visualRange < 9001 then @sprite.thang.visualRange else 0
]
# Draw the outer circle
@mark.graphics.drawCircle 0, 0, r * Camera.PPM
# Cut out the inner circle
if Math.max(ranges['1'], ranges['2']) < r
@mark.graphics.arc 0, 0, Math.max(ranges['1'], ranges['2']) * Camera.PPM, Math.PI*2, 0, true
else if Math.min(ranges['1'], ranges['2']) < r
@mark.graphics.arc 0, 0, Math.min(ranges['1'], ranges['2']) * Camera.PPM, Math.PI*2, 0, true
if colors[range]?
@mark.graphics.beginFill colors[range]
else
@mark.graphics.beginFill extracolors[i]
# Draw the outer circle
@mark.graphics.drawCircle 0, 0, @sprite.thang[range] * Camera.PPM
# Cut out the hollow part if necessary
if i+1 < @sprite.ranges.length
@mark.graphics.arc 0, 0, @sprite.ranges[i+1]['radius'], Math.PI*2, 0, true
# Add perspective
@mark.scaleY *= @camera.y2x

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -104,7 +104,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
diplomat_suggestion:
title: "Pomóż w tłumaczeniu CodeCombat!"
sub_heading: "Potrzebujemy twoich zdolności językowych."
pitch_body: "Tworzymy CodeCombat w języku angielskim, jednak nasi gracze pochodzą z całego świata. Wielu z nich chciałoby zagrać zagrać w swoim języku, ponieważ nie znają angielskiego, więc jeśli znasz oba języki zostań Dyplomatą i pomóż w tłumaczeniu strony CodeCombat, jak i samej gry."
pitch_body: "Tworzymy CodeCombat w języku angielskim, jednak nasi gracze pochodzą z całego świata. Wielu z nich chciałoby zagrać w swoim języku, ponieważ nie znają angielskiego, więc jeśli znasz oba języki zostań Dyplomatą i pomóż w tłumaczeniu strony CodeCombat, jak i samej gry."
missing_translations: "Dopóki nie przetłumaczymy wszystkiego na polski, będziesz widział niektóre napisy w języku angielskim."
learn_more: "Dowiedz się więcej o Dyplomatach"
subscribe_as_diplomat: "Dołącz do Dyplomatów"
@ -198,7 +198,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
multiplayer_title: "Ustawienia multiplayer"
multiplayer_link_description: "Przekaż ten link, jeśli chcesz, by ktoś do ciebie dołączył."
multiplayer_hint_label: "Podpowiedź:"
multiplayer_hint: "Klikjnij link by zaznaczyć wszystko, potem wciśnij Cmd-C lub Ctrl-C by skopiować ten link."
multiplayer_hint: "Kliknij link by zaznaczyć wszystko, potem wciśnij Cmd-C lub Ctrl-C by skopiować ten link."
multiplayer_coming_soon: "Wkrótce więcej opcji multiplayer"
guide_title: "Przewodnik"
tome_minion_spells: "Czary twojego podopiecznego"
@ -240,12 +240,12 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
main_title: "Edytory CodeCombat"
main_description: "Stwórz własne poziomy, kampanie, jednostki i materiały edukacyjne. Zapewniamy wszystkie narzędzia, jakich będziesz potrzebował!"
article_title: "Edytor artykułów"
article_description: "Pisz artykuły, które dostarczą graczom wiedzy co do konceptów programistycznych, które będą mogli użyć w poziomach i kampaniach."
article_description: "Pisz artykuły, które dostarczą graczom wiedzy co do konceptów programistycznych, których będą mogli użyć w poziomach i kampaniach."
thang_title: "Edytor obiektów"
thang_description: "Twórz jednostki, definiuj ich domyślną logikę, grafiki i dźwięki. Aktualnie wspiera wyłącznie importowanie grafik wektorowych wyeksportowanych przez Flash."
level_title: "Edytor poziomów"
level_description: "Zawiera narzędzia do skryptowania, przesyłania dźwięków i konstruowania spersonalizowanych logik, by móc tworzyć najrozmaitsze poziomy. Wszystko to, czego sami używamy!"
security_notice: "Wiele ważnych fukncji nie jest obecnie domyślnie włączonych we wspomnianych edytorach. Wraz z ulepszeniem zabezpieczenia tych narzędzi, staną się one dostępne publicznie. Jeśli chciałbyś użyć ich już teraz, "
security_notice: "Wiele ważnych funkcji nie jest obecnie domyślnie włączonych we wspomnianych edytorach. Wraz z ulepszeniem zabezpieczenia tych narzędzi, staną się one dostępne publicznie. Jeśli chciałbyś użyć ich już teraz, "
contact_us: "skontaktuj się z nami!"
hipchat_prefix: "Możesz nas też spotkać w naszym"
hipchat_url: "pokoju HipChat."
@ -259,7 +259,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
level_tab_systems: "Systemy"
level_tab_thangs_title: "Aktualne obiekty"
level_tab_thangs_conditions: "Warunki początkowe"
level_tab_thangs_add: "Dodoaj obiekty"
level_tab_thangs_add: "Dodaj obiekty"
level_settings_title: "Ustawienia"
level_component_tab_title: "Aktualne komponenty"
level_component_btn_new: "Stwórz nowy komponent"
@ -318,9 +318,9 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
who_is_codecombat: "Czym jest CodeCombat?"
why_codecombat: "Dlaczego CodeCombat?"
who_description_prefix: "założyli CodeCombat w 2013 roku. Stworzyliśmy również "
who_description_suffix: "w roku 2008, doprowadzajac go do pierwszego miejsca wśród aplikacji do nauki zapisu chińskich i japońskich znaków zarówno wśród aplikacji internetowych, jak i aplikcji dla iOS."
who_description_suffix: "w roku 2008, doprowadzajac go do pierwszego miejsca wśród aplikacji do nauki zapisu chińskich i japońskich znaków zarówno wśród aplikacji internetowych, jak i aplikacji dla iOS."
who_description_ending: "Teraz nadszedł czas, by nauczyć ludzi programowania."
why_paragraph_1: "Podczas tworzenia Skrittera, George nie umiał programować i ciągle towarzyszyła mu frustracja - nie mógł zaimplementować swoich pomysłów. Próbował się uczyć, lecz lekcje były zbyt wolne. Jego współlokator, chcąc się przebranżowić, spróbował Codeacademy, lecz \"nudziło go to.\" Każdego tygodnia któryś z kolegów podchodził do Codeacadem, by wkrótce potem zrezygnować. Zdaliśmy sobie sprawę, że mamy do czynienia z tym samym problemem, który rozwiązaliśmy Skritterem: ludzie uczący się umiejętności poprzez powolne, ciężkie lekcje, podczas gdy potrzebują oni szybkiej, energicznej praktyki. Wiemy, jak to naprawić."
why_paragraph_1: "Podczas tworzenia Skrittera, George nie umiał programować i ciągle towarzyszyła mu frustracja - nie mógł zaimplementować swoich pomysłów. Próbował się uczyć, lecz lekcje były zbyt wolne. Jego współlokator, chcąc się przebranżowić, spróbował Codeacademy, lecz \"nudziło go to.\" Każdego tygodnia któryś z kolegów podchodził do Codeacademy, by wkrótce potem zrezygnować. Zdaliśmy sobie sprawę, że mamy do czynienia z tym samym problemem, który rozwiązaliśmy Skritterem: ludzie uczący się umiejętności poprzez powolne, ciężkie lekcje, podczas gdy potrzebują oni szybkiej, energicznej praktyki. Wiemy, jak to naprawić."
why_paragraph_2: "Chcesz nauczyć się programowania? Nie potrzeba ci lekcji. Potrzeba ci pisania dużej ilości kodu w sposób sprawiający ci przyjemność."
why_paragraph_3_prefix: "O to chodzi w programowaniu - musi sprawiać radość. Nie radość w stylu"
why_paragraph_3_italic: "hura, nowa odznaka"
@ -332,10 +332,10 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
why_ending_url: "Zostań czarodziejem już teraz!"
george_description: "CEO, człowiek od biznesu, web designer, game designer, i mistrz wszystkich początkujących programistów."
scott_description: "Programista niezwykły, software architect, czarodziej kuchenny i mistrz finansów. Scott to ten rozsądny."
nick_description: "Programistyczny czarownik, ekscentryczny magik i eksperymentator pełną gębą. Nich może robić cokolwiek, a decyduje się pracować przy CodeCombat."
nick_description: "Programistyczny czarownik, ekscentryczny magik i eksperymentator pełną gębą. Nick może robić cokolwiek, a decyduje się pracować przy CodeCombat."
jeremy_description: "Magik od kontaktów z klientami, tester użyteczności i organizator społeczności; prawdopodobnie już rozmawiałeś z Jeremym."
michael_description: "Programista, sys-admin, cudowne dziecko studiów technicznych, Michael to osoba utrzymująca nase serwery online."
# glen_description: "Programmer and passionate game developer, with the motivation to make this world a better place, by developing things that mather. The word impossible can't be found in his dictionary. Learning new skills is his joy!"
michael_description: "Programista, sys-admin, cudowne dziecko studiów technicznych, Michael to osoba utrzymująca nasze serwery online."
glen_description: "Programmer and passionate game developer, with the motivation to make this world a better place, by developing things that mather. The word impossible can't be found in his dictionary. Learning new skills is his joy!"
legal:
page_title: "Nota prawna"
@ -356,7 +356,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
email_settings_url: "twoje ustawienia e-mail"
email_description_suffix: "lub poprzez linki w e-mailach, które wysyłamy, możesz zmienić swoje ustawienia i w prosty sposób wypisać się z subskrypcji w dowolnym momencie."
cost_title: "Koszty"
cost_description: "W tym momencie CodeCombat jest w stu procentach darmowe! Jednym z naszych głównych celów jest, by utrzymac taki stan rzeczy, aby jak najwięcej ludzi miało dostęp do gry, bez względu na ich zasobnośc. Jeśli nadejdą gorsze dni, dopuszczamy możliwość wprowadzenia płatnych subskrypcji lub pobierania opłat za część zawartości, ale wolelibyśmy, by tak się nie stało. Przy odrobinie szczęścia, uda nam się podtrzymać obecną sytuację dzięki:"
cost_description: "W tym momencie CodeCombat jest w stu procentach darmowe! Jednym z naszych głównych celów jest, by utrzymać taki stan rzeczy, aby jak najwięcej ludzi miało dostęp do gry, bez względu na ich zasobność. Jeśli nadejdą gorsze dni, dopuszczamy możliwość wprowadzenia płatnych subskrypcji lub pobierania opłat za część zawartości, ale wolelibyśmy, by tak się nie stało. Przy odrobinie szczęścia, uda nam się podtrzymać obecną sytuację dzięki:"
recruitment_title: "Rekrutacji"
recruitment_description_prefix: "Dzięki CodeCombat, staniesz się potężnym czarodziejem - nie tylko w grze, ale również w prawdziwym życiu."
url_hire_programmers: "Firmy nie nadążają z zatrudnianiem programistów"
@ -393,7 +393,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
rights_description: "Opisy"
rights_writings: "Teksty"
rights_media: "Multimedia (dźwięki, muzyka) i jakiekolwiek inne typy prac i zasobów stworzonych specjalnie dla danego poziomu, które nie zostały publicznie udostępnione do tworzenia poziomów."
rights_clarification: "Gwoli wyjaśnienia, wszystko, co jest dostępne w Edytorze Poziomów w celu tworzenia nowych poziomów podlega licencji CC, podczas gdy zasoby stworzone w Edytorze Poziomów lub przesłane w toku tworzenia poziomu - nie."
rights_clarification: "Gwoli wyjaśnienia, wszystko, co jest dostępne w Edytorze Poziomów w celu tworzenia nowych poziomów, podlega licencji CC, podczas gdy zasoby stworzone w Edytorze Poziomów lub przesłane w toku tworzenia poziomu - nie."
nutshell_title: "W skrócie"
nutshell_description: "Wszelkie zasoby, które dostarczamy w Edytorze Poziomów są darmowe w użyciu w jakikolwiek sposób w celu tworzenia poziomów. Jednocześnie, zastrzegamy sobie prawo do ograniczenia rozpowszechniania poziomów (stworzonych przez codecombat.com) jako takich, aby mogła być za nie w przyszłości pobierana opłata, jeśli dojdzie do takiej konieczności."
canonical: "Angielska wersja tego dokumentu jest ostateczna, kanoniczną wersją. Jeśli zachodzą jakieś rozbieżności pomiędzy tłumaczeniami, dokument anglojęzyczny ma pierwszeństwo."

View file

@ -75,13 +75,14 @@
right: 0
top: 0
bottom: 0
#thangs-list
position: absolute
position: relative
right: 0
top: 40px
top: 0
bottom: 0
overflow: scroll
height: 100%
h3
margin: 0 -20px 0 0

View file

@ -22,7 +22,8 @@
#canvas-top-gradient.gradient
.add-thangs-palette.thangs-column
h3(data-i18n="editor.level_tab_thangs_add") Add Thangs
#thangs-header
h3(data-i18n="editor.level_tab_thangs_add") Add Thangs
#thangs-list
for group in groups
h4= group.name

View file

@ -5,7 +5,7 @@ block content
h1#site-slogan(data-i18n="home.slogan") Learn to Code JavaScript by Playing a Game
#trailer-wrapper
<iframe width="920" height="518" src="//www.youtube.com/embed/1zjaA13k-dA?rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720" frameborder="0" allowfullscreen></iframe>
<iframe width="920" height="518" src="//www.youtube.com/embed/1zjaA13k-dA?rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720&wmode=transparent" frameborder="0" allowfullscreen></iframe>
img(src="/images/pages/home/video_border.png")
hr

View file

@ -7,7 +7,7 @@ block modal-header-content
block modal-body-content
.multiplayer-launch-wrapper
<iframe id="multiplayer-video" width="640" height="360" src="//www.youtube.com/embed/wfc0U74LFCk?&rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720" frameborder="0" allowfullscreen></iframe>
<iframe id="multiplayer-video" width="640" height="360" src="//www.youtube.com/embed/wfc0U74LFCk?&rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720&wmode=transparent" frameborder="0" allowfullscreen></iframe>
img(src="/images/pages/home/video_border.png")
h3(data-i18n="multiplayer_launch.to_battle") To Battle, Developers!

View file

@ -58,6 +58,7 @@ div#columns.row
span(data-i18n="ladder.watch_victory") Watch your victory
else
span(data-i18n="ladder.defeat_the") Defeat the
|
| #{team.otherTeam}
if !team.matches.length

View file

@ -104,12 +104,19 @@ module.exports = class ThangsTabView extends View
context.groups = groups
context
onWindowResize: (e) ->
$('#thangs-list').height('100%')
thangsHeaderHeight = $('#thangs-header').height()
oldHeight = $('#thangs-list').height()
$('#thangs-list').height(oldHeight - thangsHeaderHeight)
afterRender: ->
return if @startsLoading
super()
$('.tab-content').click @selectAddThang
$('#thangs-list').bind 'mousewheel', @preventBodyScrollingInThangList
@$el.find('#extant-thangs-filter button:first').button('toggle')
$(window).resize @onWindowResize
onFilterExtantThangs: (e) ->
@$el.find('#extant-thangs-filter button.active').button('toggle')
@ -145,6 +152,9 @@ module.exports = class ThangsTabView extends View
@thangsTreema.open()
@onThangsChanged() # Initialize the World with Thangs
@initSurface()
thangsHeaderHeight = $('#thangs-header').height()
oldHeight = $('#thangs-list').height()
$('#thangs-list').height(oldHeight - thangsHeaderHeight)
initSurface: ->
surfaceCanvas = $('canvas#surface', @$el)

View file

@ -72,20 +72,15 @@ module.exports = class LadderView extends RootView
@showPlayModal(hash) if @sessions.loaded
fetchSessionsAndRefreshViews: ->
return if @destroyed or application.userIsIdle or @$el.find('#simulate.active').length or (new Date() - 2000 < @lastRefreshTime)
@sessions.fetch({"success": @refreshViews})
refreshViews: =>
return if @destroyed or application.userIsIdle
if @$el.find("#ladder.active").length
return if new Date() - 2000 < @lastLadderRefreshTime
@lastLadderRefreshTime = new Date()
@ladderTab.refreshLadder()
console.log "Refreshing ladder."
if @$el.find("#my-matches.active").length
return if new Date() - 2000 < @lastMatchesRefreshTime
@lastMatchesRefreshTime = new Date()
@myMatchesTab.refreshMatches()
console.log "Refreshing matches view."
@lastRefreshTime = new Date()
@ladderTab.refreshLadder()
@myMatchesTab.refreshMatches()
console.log "Refreshed sessions for ladder and matches."
onIdleChanged: (e) ->
@refreshViews() unless e.idle

View file

@ -5,4 +5,4 @@ module.exports.setup = ->
winston.add(winston.transports.Console,
colorize: true,
timestamp: true
)
)