v0.6
This commit is contained in:
parent
5c890a420f
commit
9b8c265f6f
43 changed files with 1125 additions and 630 deletions
18
MANUAL
18
MANUAL
|
@ -122,8 +122,24 @@ Injured units in villages will recover 8 hitpoints every turn. Injured units tha
|
|||
|
||||
'Heal' prevents poisoning to cause damage while 'cure' removes poisoning. When poisoning is cured unit does not gain hitpoints on that turn.
|
||||
|
||||
|
||||
Experience
|
||||
|
||||
Units are awarded experience for fighting, and after obtaining enough experience, they will advance a level, and become more powerful.
|
||||
|
||||
Multiplayer
|
||||
|
||||
There are a number of ways to play a multiplayer game of Wesnoth. The simplest way is a 'hotseat' game: Multiple players on one computer, each player takes the 'hotseat' when it is their turn. To start a 'hotseat' game, select 'Multiplayer' from the main menu -> 'Host Multiplayer Game'. After selecting your map, change all the names in 'Player/Type' to be human players or computer players (i.e. no 'Network Players'), and then start your game.
|
||||
|
||||
You can also play networked games of Wesnoth. One player 'hosts' a game on their computer, and other players join. Select 'Multiplayer' -> 'Host Multiplayer Game', and then change some of the 'Player/Type' entries to 'Network Player'. Once you start the game, it will wait for other players to connect. The other players must select 'Multiplayer' -> 'Join Game', and then type the host name or ip address of the player who is hosting the game.
|
||||
|
||||
Once all players have joined the game, the game will start. The player hosting the game must be able to receive connections on port 15000. The other players must be able to connect to port 15000 on a remote machine. You can only play network games against players who have exactly the same version of the game as you.
|
||||
|
||||
You can also play games over the Wesnoth server. Wesnoth has two public servers:
|
||||
|
||||
server.wesnoth.org: for releases of the game devsrv.wesnoth.org: for CVS versions of the game
|
||||
|
||||
To connect to a server, select 'Multiplayer' -> 'Join Game' and then type in the host name of the server. You must be using the exact version of the game the server is intended to be used with to be allowed onto the server.
|
||||
|
||||
Once you are on the server, you will be placed in the 'lobby' areas. The lobby is where you can see which other players are online, see the games currently open, and create new games. One player should create the game, and other players can join the game.
|
||||
|
||||
It is possible to simply observe an ongoing game, by joining the game as an 'Observer'.
|
||||
|
|
16
changelog
16
changelog
|
@ -4,6 +4,7 @@ Version 0.6:
|
|||
* enemy units do not vanish anymore when enemy leader is killed
|
||||
* new scenarios for 'Heir to the Throne' (Konrad's Tale):
|
||||
* Isle of the Damned
|
||||
* Crossroads
|
||||
* Northern Winter
|
||||
* The Lost General
|
||||
* Hasty Alliance
|
||||
|
@ -17,6 +18,7 @@ Version 0.6:
|
|||
* Dwarven Doors
|
||||
* Mountain Pass
|
||||
* Valley of Death
|
||||
* Ford of Abez
|
||||
* support for multiple campaigns
|
||||
* new campaign started: 'Hordes of the Undead'
|
||||
* multiplayer improvements:
|
||||
|
@ -39,6 +41,7 @@ Version 0.6:
|
|||
* income calculations are now done at the beginning of each player's turn
|
||||
* made it so units that can no longer advance have experience needed displayed as '-'
|
||||
* allow use of escape to exit out of ok/cancel and yes/no dialogs with negative results
|
||||
* double-click support in menus
|
||||
* new units:
|
||||
* Heavy Infantry
|
||||
* Shock Trooper
|
||||
|
@ -54,12 +57,14 @@ Version 0.6:
|
|||
* reduced cost of Mage
|
||||
* changed Mage attack to fire based
|
||||
* 'Mage of Light' has now both cure and illumination
|
||||
* changed Shaman slowing attack to 3-2 from 4-1, and reduced cost from 21 to 18
|
||||
* Increased shaman slowing attack damage, decreased unit cost
|
||||
* changed 'Red Mage' to neutral alignment
|
||||
* removed 'Elvish Outrider' as evolution from Horseman
|
||||
* Scout has been renamed to Cavalry
|
||||
* Cavalry stats adjusted, increased cost by one, reduced movement by one,
|
||||
reduced experience needed to advance
|
||||
* Cavalry stats adjusted, increased cost by one, reduced movement by one, reduced experience needed to advance
|
||||
* Horseman now needs more experience to advance
|
||||
* 'Vampire Bat' now needs more experience to advance and costs more
|
||||
* 'Mage of Light' attack is now a bit more powerful
|
||||
* fixed max experience for Orcish Warlord.
|
||||
* 'Blood Bat' unit description clarified
|
||||
* Halberdier changed to 3rd level unit
|
||||
|
@ -86,6 +91,10 @@ Version 0.6:
|
|||
* fixed problem with stripping of non-latin characters at end of string in config files
|
||||
* allow internationalization of traits
|
||||
* made AI more intelligent
|
||||
* scenario building:
|
||||
* added [remove_shroud]
|
||||
* added [allow_recruit]
|
||||
* added [teleport]
|
||||
* added in support for some special effects: flashing and scrolling/tremors
|
||||
* added coding support for displaying different terrain images (particularly useful for villages) at different times of the day
|
||||
* fixed minor bugs in unit configuration files for Elvish Sharpshooter and Fencer
|
||||
|
@ -129,6 +138,7 @@ Version 0.6:
|
|||
* added error logging and correction for combat related syncing errors
|
||||
* client_type=ai in preferences-file make player join networked multiplayer games as AI player
|
||||
* added some comments to code
|
||||
* added icon to Windows distribution
|
||||
|
||||
Version 0.5.1:
|
||||
* more and improved unit graphics and animations
|
||||
|
|
2
configure
vendored
2
configure
vendored
|
@ -1337,7 +1337,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
|||
|
||||
PACKAGE=wesnoth
|
||||
MAJOR_VERSION="0"
|
||||
MINOR_VERSION="6RC3"
|
||||
MINOR_VERSION="6"
|
||||
MICRO_VERSION=""
|
||||
|
||||
if test "x$MICRO_VERSION" = "x"; then
|
||||
|
|
|
@ -6,7 +6,7 @@ AC_INIT(wesnoth, 0.5, davidnwhite@optusnet.com.au, Battle for Wesnoth)
|
|||
AC_REVISION($Version: 0.5$)
|
||||
PACKAGE=wesnoth
|
||||
MAJOR_VERSION="0"
|
||||
MINOR_VERSION="6RC3"
|
||||
MINOR_VERSION="6"
|
||||
MICRO_VERSION=""
|
||||
|
||||
if test "x$MICRO_VERSION" = "x"; then
|
||||
|
|
|
@ -43,14 +43,17 @@
|
|||
[race]
|
||||
name=dwarf
|
||||
num_traits=2
|
||||
{DWARVISH_NAMES}
|
||||
[/race]
|
||||
[race]
|
||||
name=orc
|
||||
num_traits=2
|
||||
{ORCISH_NAMES}
|
||||
[/race]
|
||||
[race]
|
||||
name=goblin
|
||||
num_traits=2
|
||||
{ORCISH_NAMES}
|
||||
[/race]
|
||||
[race]
|
||||
name=undead
|
||||
|
@ -64,6 +67,7 @@
|
|||
[race]
|
||||
name=merman
|
||||
num_traits=2
|
||||
{MERMAN_NAMES}
|
||||
[/race]
|
||||
[race]
|
||||
name=naga
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
id=intro_11
|
||||
story="Hearing of the orders of Asheviere, Delfador entered the palace by stealth, and stole away Konrad, the youngest of Garard's nephews, saving him from death."
|
||||
delay=4000
|
||||
image=misc/story6.png
|
||||
image=misc/story5.png
|
||||
[/part]
|
||||
[part]
|
||||
id=intro_12
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
ggggggfffffffffffffggggtgggcs
|
||||
fffffhfffggfftgggrgrffffggggc
|
||||
ffffffggghggghgrrgfgrrfffgggf
|
||||
ffthgggffgggtrrgggfftgrrrggff
|
||||
fffgggfgfgCChCgghhgggffgfrggf
|
||||
ffthgggffggggrrgggfftgrrrggff
|
||||
fffgggfgfggghCgghhgggffgfrggf
|
||||
fffgggffggtCC1gggggffffggrggf
|
||||
fffffgggggggCCCggfffffffggrgg
|
||||
ccccftffffgghhgffffftffcccrgt
|
||||
|
@ -15,12 +15,12 @@ sscccchhhtfmfhhhfgcccsstssscr
|
|||
ccccgthmmmhhhmmfffcsssssssccr
|
||||
tcggggghmmmtmmmhhggcccccsscrg
|
||||
ccsggggfffhhhmmmthgggcgcsccrt
|
||||
gggtggfffhhmmmmhhfffggccccRhh
|
||||
gggtggfffhhmmmmhhfffggccccrhh
|
||||
gggggfffhmmmhmmmmmfffgtcc//gf
|
||||
chhgggfffmhhhhmmhffffRc//cgtf
|
||||
chhgggfffmhhhhmmhffffrc//cgtf
|
||||
sccfgfffhhhmmmhhhhffgr/cccgff
|
||||
ccgggggfffffhhfffffrrggccgggf
|
||||
tggggffffCfhfmfrtrrggtgcggfff
|
||||
ccgggggffggfhhfffffrrggccgggf
|
||||
tggggfffgCgfghgrtrrggtgcggfff
|
||||
gggffhhfCC2Chhrfrgggggcctggfh
|
||||
ggtggftfhgCCrrrhhffccccsscghm
|
||||
ggggffhhggggggggmmcccssssschm
|
||||
|
|
41
data/maps/undmap2
Normal file
41
data/maps/undmap2
Normal file
|
@ -0,0 +1,41 @@
|
|||
ggggggffggggggggtDvcsssggggggggggggggggggggggggg
|
||||
gggggfffffggggggRRRcsgcggggggggggggggggggggggggg
|
||||
ggvggfggfffgggggRRR\cggggggggggggggggggggggggggg
|
||||
ggggCCgggffggggcRc\Rggggggggtggggggtgggggggggggg
|
||||
ggffC1Cggggggtcc|ccgRRgggggggggggtgggggggggggggg
|
||||
gggfffCffggghhggccggRRgggggggggggggggggggggggggg
|
||||
ggggfffffgghhggccggggRRggggggggCCCgggggggggggggg
|
||||
ccggggggghhggccgggggggRtgggggggC3ggggggggggggggg
|
||||
ccccgcchhgcccggggggggrrrggggggghCggggggggggggggg
|
||||
gvccccctgccggggggggggggrrrgggggtgggggggggggfffff
|
||||
ggggggcccggggvgggggggmggggrggggggggggggggggggggg
|
||||
gggggggggggggggggggmhhhgggrggggggggggggggggggggg
|
||||
ggggggvgggggggggghghhfgffgrrgvgggggggggggggggggg
|
||||
gggggggggggggggggggffffffhgrggggggtggggggggggggg
|
||||
gggggggggggggggggffffhfghhmrfggggggggggggggggggg
|
||||
gggggggtgggggggggffhfffghgggrrgggggggggggggggggg
|
||||
ggggggggggggggggggfffffvggggvgrrgggvgggggggggggg
|
||||
ggtgggggggggggggggggfggggggggggrgggggggggggggggg
|
||||
gggggggggggggggggggggggggggggggrggggggCggggggggg
|
||||
ggggggggggDggtgggggggggggggggggrgggggCCCgggggggg
|
||||
ggggggggggggmumugggggggggggggrrvgggggC2ggggggggg
|
||||
gggggggggggguuuuuugggggggggrrgggggggggCCgggggggg
|
||||
ggggggggggmguuDumuugmggggrrggggggggggggggggggggg
|
||||
gggtggggggmmmuuuumummrrrrggggtgggggggggggggggggg
|
||||
ggggggggggguuuugmggrrgggggggggggggggggggggghfggg
|
||||
gmggggggDgggggDgggggggggDcccggggggggvgggggfghggg
|
||||
hhfhhggggggggggggggggggggggcc/ggtgggggggggfhfhff
|
||||
tmmgggggggggghmmgfmggggtggggcgccccggggggtggtffgf
|
||||
hhghhgggggggggfghfgmgfgggggggggcscccggggggffhggg
|
||||
ggggggggggggggggfgggtggggggggggcsscccgggggfghgfg
|
||||
ggggggtgggggggggmggggggggggggtgccsscgggggggggggg
|
||||
ggggggggggCCgtggggggggggggggggggcccggggggggggggg
|
||||
gggggggggm4CCggggggggggggggggggggggggggggggggggg
|
||||
ggggggggggCggggggggggggtggggggggggggggggtggggggg
|
||||
gggggggggggggggggggggggggggggghgffffgggggggggggg
|
||||
ggggggtggggggggggggggggggggghgffffgghggggggggggg
|
||||
ggggggggggggggggggggggggggggfffmffffghhgggggtggg
|
||||
ggggggggggggggtgggggggggggffffghfggffmfffggggggg
|
||||
ggggggggggggggggggggggggggggfhfggthggggtgggggggg
|
||||
ggggggggggggggggggggggggggfffghhggggggggggtggggg
|
||||
gggggggggggggggggggggggggggggggggggtgggggggggggg
|
|
@ -7,3 +7,15 @@ female_names="Vil-Gandra,Legaraclya,Tin
|
|||
male_names="Cunry,Bluran,Marcyn,Addraenvan,Gudd,Aetheollyn,Rhenyc,Gyllyn,Dircyn,Owaecyn,Blollyn,Glyran,Vygwyn,Yracyn,Rhaecyn,Rheor,Aethagwyn,Vennyn,Yryrcyn,Glynvan,Ryddry,Saemyr,Dibryn,Owuddry,Gloddyn,Gladoc,Yroddry,Bladoc,Addreonyc,Rheoran,Tiryn,Glynry,Rhaemyr,Gweddyn,Cemyr,Mimyr,Caraennyn,Careorraent,Gwor,Cin,Goc,Glydd,Oweomyr,Carraent,Gubryn,Gannyn,Aethadry,Aethonnyn,Blygwyn,Laellyn,Carudoc,Ladoc,Blercyn,Carocyn,Aetheoc,Rumyr,Gaercyn,Careogwyn,Caryn,Careddry,Owarcyn,Daeddry,Mubryn,Gwymyr,Blaedry,Owaryn,Addreddry,Owaryn,Taedoc,Addraecyn,Morcyn,Vugwyn,Rhenry,Blullyn,Dycyn,Daeddry,Blydd,Seddyn,Teoddyn,Gwaec,Rycyn,Rhobryn,Gwyddry,Tudoc,Roddyn,Oweran,Ceoddyn,Blubryn,Glonry,Sedry,Owecyn,Blydd,Owinyc,Gwuran,Yryllyn,Tunvan,Gwan,Carac,Cebryn,Murcyn,Ronry,Geodry,Midry,Gweogwyn,Aethec,Blinvan,Rhyrraent,Aethaeryn,Seoddry,Caradoc,Aethenvan,Sanyc,Aethaec,Gwumyr,Teorcyn,Lenvan,Rabryn,Yrynyc,Murcyn,Mydoc,Yrannyn,Rhobryn,Oworraent,Owac,Vuddyn,Gwellyn,Glaercyn,Yregwyn,Oweorcyn,Addrenyc,Rhaedoc,Carocyn,Rhonvan,Owercyn,Dadd,Corcyn,Addrocyn,Yreryn,Tinry,Rharcyn,Gweddry,Rar,Addroryn,Tabryn,Blinvan,Addrunvan,Derraent,Leogwyn,Virraent,Gwudoc,Lercyn,Glarraent,Caren,Liryn,Gwegwyn,Ligwyn,Gwybryn,Lin,Veoddyn,Owodd,Cariddry,Glonvan,Gymyr,Aethuc,Careonvan,Aethudry,Addreoddyn,Gweocyn,Vonry,Rhygwyn,Rhyrcyn,Rhur,Deonyc,Veocyn,Siryn,Teobryn,Yraec,Gweodry,Caroran,Caraedry,Vaennyn,Moddry,Vaeddyn,Caredd,Siddry,Aethyr,Aethacyn,Rheorraent,Rhubryn,Addrurcyn,Sodry,Rhunyc,Gweodd,Reoddyn,Vinyc,Glydoc,Sodd,Dyddyn,Dinnyn,Ruddry,Addraryn,Gwollyn,Rurcyn,Glinry,Blyr,Aetharcyn,Blybryn,Addraercyn,Cararyn,Carygwyn,Menvan,Caric,Turraent,Oworcyn,Gwennyn,Meorraent,Ludoc,Aethoddyn,Glyc,Oworan,Simyr,Aethugwyn,Gwynnyn,Glunry,Cynyc,Addregwyn,Maddyn,Gecyn,Deollyn,Gwidoc,Meon,Goc,Sudd,Yredd,Addredry,Caeran,Vobryn,Saellyn,Surcyn,Taercyn,Labryn,Yran,Ceomyr,Caroddyn,Deodd,Glunvan,Gwoddyn,Addrocyn,Aethydry,Carygwyn,Aethynyc,Aetheorcyn,Taec,Rocyn,Laellyn,Tinvan,Owaedry,Teor,Ceonnyn,Rynry,Lunnyn,Myn,Rynnyn,Dac,Owaddyn,Vyc,Bliddry,Gur,Gwumyr,Owinvan,Maennyn,Veogwyn,Blenvan,Owur,Curyn,Gleoddyn,Aethec,Aethanry,Lec,Blanry,Vaddyn,Modd,Gaddry,Yrinvan,Blidd,Rheran,Veomyr,Owadd,Saran,Gullyn,Owollyn,Aethiddry,Gloddry,Carullyn,Secyn,Manyc,Romyr,Vinvan,Careoryn,Gegwyn,Gleddry,Tennyn,Manry,Syran,Gor,Ceoddry,Aethobryn,Yrunvan,Yraryn,Oweor,Daellyn,Mec,Lannyn,Owyran,Lemyr,Rhaedoc,Yrullyn,Syryn,Bludry,Bledoc,Addroran,Caregwyn,Tuddry,Careobryn,Addrenyc,Aethellyn,Veodry,Meonnyn,Myrraent,Addraer,Aethun,Coc,Sarraent,Rheollyn,Reodry,Blucyn,Caedry,Mudoc,Sydd,Carygwyn,Cadry,Gwucyn,Ten,Ron,Lan,Owoddry,Owugwyn,Tarcyn,Owuddyn,Rhenvan,Tanry,Aetheonyc,Caraddry,Blaec,Yrunnyn,Glircyn,Aetherraent,Rheoddyn,Cennyn,Ginvan,Gweoran,Gumyr,Blymyr,Rygwyn,Gagwyn,Addrynvan,Rherraent,Yrymyr,Laran,Rubryn,Ceoc,Gwodd,Gwadoc,Gwenyc,Corcyn,Gaebryn,Gwydoc,Yrumyr,Caregwyn,Rheollyn,Rhollyn,Gliddyn,Owedry,Aethercyn,Caryn,Saec,Vogwyn,Lorraent,Mygwyn,Cac,Mac,Tarcyn,Deoran,Tenvan,Ronry,Gwaec,Seorcyn,Soran,Luddry,Addreran,Yranvan,Gwidoc,Ceonry,Glacyn,Varcyn,Vyrcyn,Terraent,Blillyn,Run,Ligwyn,Rhyllyn,Sercyn,Denvan,Convan,Owogwyn,Gar,Glumyr,Rheodd,Cicyn,Blac,Daedoc,Gweodoc,Addreorcyn,Caercyn,Rhynyc,Lunnyn,Dadoc,Sellyn,Aethaeran,Gydoc,Sodry,Tyddyn,Rhaerraent,Gan,Lunvan,Saercyn,Gaedry,Rhodry,Taenvan,Radd,Caror,Monry,Mugwyn,Meollyn,Glun,Moran,Rybryn,Aethibryn,Gwaec,Addryllyn,Caebryn,Cinry,Ranvan,Blemyr,Addriddyn,Rhugwyn,Gwycyn,Blebryn,Yranvan,Teddyn,Vaedry,Addreoddry,Taedd,Cyryn,Yrirraent,Aethercyn,Middry,Lurraent,Bleollyn,Aethircyn,Ven,Modd,Ceoryn,Carercyn,Lonnyn,Car,Taemyr,Owidry,Geddyn,Aethunry,Yreddyn,Addribryn,Suc,Gleran,Addredry,Cubryn,Veocyn,Caryn,Demyr,Tudd,Romyr,Lenvan,Glillyn,Sennyn,Rhanry,Blennyn,Gwaeddyn,Saenvan,Todd,Tegwyn"
|
||||
female_names="Jongwen,Dullyra,Alena,Nwryan,Elycla,Sulonna,Bruryan,Caengwen,Nwvyan,Lwcla,Jarka,Rwlla,Alwcla,Breall,Nylyan,Cylyan,Syssa,Jolla,Gwoll,Lynoic,Elwllyra,Clarka,Clwlla,Cira,Lylla,Elavyan,Meroniver,Lwlla,Reacla,Neallyra,Mudda,Brirka,Alyryan,Reangwen,Sorka,Nalyan,Ysilyan,Realla,Lyna,Rwllyra,Elyrka,Nera,Gwwcla,Caella,Jevyan,Gwwvyan,Nuvyan,Sona,Merolla,Nyssa,Sera,Lwryan,Ysell,Elulonna,Raerka,Saell,Dwnoic,Clissa,Medda,Lessa,Rwllyra,Ledda,Jeabrylla,Brera,Meanoic,Lelyan,Clobrylla,Brellyra,Nucla,Jalyan,Dydda,Cyvyan,Revyan,Nyll,Clillyra,Langwen,Jyvyan,Saellyra,Sera,Sara,Rucla,Ryngwen,Cicla,Lolonna,Lycla,Merydda,Naecla,Aleara,Rwlla,Curyan,Lina,Mylla,Rarka,Merubrylla,Clwdda,Gwerka,Saessa,Brungwen,Jonoic,Elalonna,Elwlonna,Lidda,Dyssa,Cassa,Relyan,Gworyan,Dwdda,Alengwen,Lill,Raebrylla,Elwra,Joll,Brerka,Mengwen,Caevyan,Mwnoic,Nivyan,Merina,Rilonna,Gwangwen,Gwussa,Lealonna,Cwdda,Jaerka,Jassa,Sassa,Elerka,Elaedda,Sull,Elyngwen,Mwbrylla,Livyan,Maecla,Cwlonna,Ysodda,Elurka,Clylla,Clilyan,Daenoic,Naell,Brynoic,Syssa,Nulla,Merebrylla,Breabrylla,Call,Jycla,Dulonna,Gwirka,Dollyra,Alybrylla,Elaell,Jura,Dalla,Mereangwen,Cinoic,Naell,Ysyrka,Alearka,Jiryan,Ysonoic,Ysycla,Merilyan,Brorka,Jull,Alwllyra,Cealonna,Gwonoic,Gwobrylla,Brellyra,Curyan,Moniver,Cleall,Elara,Lylyan,Daelyan,Relyan,Sallyra,Cleacla,Alalonna,Elealla,Ysyssa,Clacla,Rilyan,Jeniver,Aleaniver,Meraelyan,Gweacla,Jwll,Elealla,Lirka,Milonna,Lealyan,Messa,Nabrylla,Lollyra,Merona,Meressa,Bravyan,Elaevyan,Ceryan,Mereaniver,Ysaenoic,Gwaessa,Alearka,Myra,Nobrylla,Jona,Jyrka,Cyniver,Lulyan,Rerka,Swlla,Nybrylla,Yswniver,Dangwen,Gwicla,Yseacla,Eleanoic,Mwngwen,Neavyan,Larka,Brealonna,Gwycla,Aluryan,Meacla,Brona,Jyvyan,Brwra,Coryan,Cudda,Elivyan,Nyryan,Alyra,Alilonna,Merana,Merylyan,Cydda,Diniver,Merolyan,Myll,Rwlonna,Gweacla,Ysylla,Alaebrylla,Naebrylla,Clenoic,Daengwen,Reana,Alynoic,Jissa,Myvyan,Brora,Alaryan,Rengwen,Clavyan,Ryna,Jull,Brollyra,Brobrylla,Ysedda,Alingwen,Ysell,Jealla,Liryan,Merurka,Elallyra,Clinoic,Ninoic,Merudda,Gwongwen,Jacla,Nungwen,Clalla,Gwona,Gwaera,Rora,Ninoic,Brycla,Clwvyan,Clurka,Clill,Merella,Ysylyan,Rwdda,Lelonna,Yselonna,Claella,Clallyra,Dassa,Clealyan,Merydda,Cibrylla,Deanoic,Claenoic,Rassa,Gwwvyan,Cucla,Lwnoic,Aluniver,Dwbrylla,Dybrylla,Merissa,Ysealyan,Clydda,Maeniver,Dallyra,Nessa,Gwydda,Merall,Clill,Clungwen,Ysongwen,Cucla,Jora,Elyniver,Meana,Sallyra,Ysinoic,Clara,Meradda,Dwra,Nolla,Nera,Merealonna,Clibrylla,Alaeniver,Nonoic,Jacla,Rara,Cwngwen,Dara,Ysura,Sulonna,Dissa,Clona,Ralonna,Cwvyan,Mulyan,Lungwen,Mwlyan,Meralonna,Lerka,Noryan,Curyan,Mealyan,Nera,Sylyan,Merivyan,Lwnoic,Sanoic,Ysanoic,Cyllyra,Ysyrka,Cleanoic,Bronoic,Devyan,Ysaerka,Rwngwen,Nwllyra,Ysycla,Swngwen,Nyvyan,Cleana,Merylyan,Alwlyan,Lassa,Locla,Meniver,Laenoic,Mullyra,Judda,Mycla,Brassa,Ysacla,Elacla,Muryan,Clollyra,Ysanoic,Senoic,Rwngwen,Merwlla,Brera,Saeniver,Deassa,Meranoic,Bronoic,Aleacla,Mavyan,Alora,Jarka,Elaelonna,Merwryan,Lengwen,Alilonna,Meangwen,Claelyan,Silonna,Ysealyan,Alora,Revyan,Cera,Merwnoic,Dicla,Laeryan,Alubrylla,Lycla,Mavyan,Jull,Syllyra,Swlyan,Elaessa,Caena,Cluvyan,Breryan,Laeniver,Jorka,Raera,Gwedda,Lodda,Brell,Rybrylla,Meanoic,Niryan,Cylla,Bricla,Cudda,Alabrylla,Nealonna,Alolla,Rirka,Jyniver,Elearka,Jaevyan,Melonna,Alengwen,Sura,Cissa,Mossa,Norka,Nangwen,Saerka,Elycla,Della,Merallyra,Elyllyra,Elenoic,Alussa,Elwngwen,Calla,Merina,Jynoic,Ysealonna,Sussa,Sulyan,Mossa,Dissa,Daedda,Merinoic,Searka,Rella,Sira,Clillyra,Alwna,Lulla,Nulyan,Jwlyan,Swnoic,Clongwen,Alalla,Siryan,Braedda,Jealla,Gwwna,Gwullyra,Merengwen,Molyan,Dwna,Lunoic,Brealla,Ruryan,Alabrylla,Deassa,Jovyan,Subrylla,Breana,Ysura,Alolonna,Nealla,Nessa,Swvyan,Cora,Luryan,Jana,Meraecla,Jeanoic,Sena,Alolla,Jaena,Julonna"
|
||||
#enddef
|
||||
|
||||
#define MERMAN_NAMES
|
||||
male_names="Neptune,Poseidon,Triton,Oceanus,Nereus,Pontus,Phorcys,Scylla,Thaumas,Tangaroa,Tangaloa,Kulullu,Nethuns,Proteus,Okeanos,Maui,Ryujin,Njord,Barinthus,Llyr,Lir,Aigaion,Melicertes,Dylan,Tanaoa,Tikitiki,Typhon,Alastyn,Apam,Natat,Vourukasa,Vodnik,Faro,Nun,Habaek,Apsu,Abzu,Absu,Sisiutl,Atlaua,Atlahua,Jamm,Vizi,Ember,Toniwha,Apalala,Dhakhan,Nechtan,Elcmar,Mimir,Enki,Makara,Aremata,Rorua,Popoa,Tinirau,Tini,Rau,Kinilau,Sinilau,Tinilau,Nudimmud,Tagaloa,Labuna,Jin,Laut,Raja,Ikatere,Nuada,Nudd,Ludd"
|
||||
#enddef
|
||||
|
||||
#define ORCISH_NAMES
|
||||
male_names="Erang,Bugdish,Eradash,Vrigor,Gruol,Gugdush,Gort,Grunk,Rurag,Poshnak,Goshnak,Rarbag,Prirbag,Biol,Vridish,Erok,Grurt,Vrorg,Grirk,Rodush,Pruk,Hunk,Goshnak,Bogor,Varbag,Hort,Graol,Gork,Vrugdush,Gagor,Gadash,Prong,Prodush,Pidush,Grorag,Grolg,Pung,Hurbag,Bink,Grort,Erugar,Vilo,Pagor,Vak,Prarg,Hurag,Eragdush,Gulg,Pragdush,Grugdush,Erirg,Gridush,Hulo,Vrogar,Eronk,Erulo,Rok,Prurk,Prurg,Grulo,Prirg,Prugar,Bogar,Prudish,Prunk,Groshnak,Eronk,Prilg,Erik,Rodush,Vulo,Pork,Prilo,Horbag,Bong,Prarag,Vourk,Vrik,Boshnak,Prong,Rugdish,Erulo,Palo,Vrik,Hak,Vrurg,Gurbag,Vrang,Pilg,Bogdush,Erurag,Vadush,Eruurk,Vank,Ruk,Vrogor,Vrurg,Bagar,Vink,Prinak,Vraurk,Prarbag,Hidush,Ruol,Grugdish,Prodash,Gridish,Pulo,Bik,Rinak,Halg,Erudish,Pirbag,Gank,Galo,Burk,Hunk,Bagdish,Pink,Bort,Gridash,Valo,Eruol,Radash,Erarg,Vigor,Vudish,Vak,Grirg,Groshnak,Pronak,Punk,Grigar,Prolg,Pigdush,Ging,Vong,Hulg,Bashnak,Vork,Ruol,Vogdish,Rinak,Gagar,Borg,Virt,Bunak,Hushnak,Ganak,Barbag,Vralo,Hidash,Vrirt,Gurt,Erarag,Rugar,Pridish,Prugdish,Eruol,Vriurk,Grudash,Vurg,Eriol,Bok,Granak,Vrodish,Hoshnak,Grogdish,Bork,Hushnak,Hagdush,Parag,Eriurk,Vuk,Rirg,Rok,Bolg,Vrishnak,Vilo,Vragar,Budush,Gruk,Bidish,Praurk,Gunak,Hinak,Hak,Grork,Grong,Erogdish,Rolo,Vadash,Pulg,Vilg,Vrodash,Vurg,Gink,Grilg,Birt,Biol,Vrudish,Hagor,Vragdush,Vogor,Vulg,Erong,Rashnak,Garag,Grink,Vogdish,Badush,Rodish,Gradash,Erart,Purbag,Pralo,Grigar,Badush,Priurk,Rink,Puurk,Vonak,Eradish,Vridash,Podush,Pruurk,Pronk,Hiol,Gushnak,Gugdish,Hashnak,Eragor,Rarbag,Gagdush,Granak,Budush,Vilg,Hort,Pulg,Gaol,Podash,Punak,Gogdush,Porg,Pogdish,Prigar,Gushnak,Prarbag,Gagar,Bogor,Gogdish,Eranak,Gralo,Palg,Virag,Grishnak,Rank,Hing,Grak,Pirbag,Prarag,Virag,Hink,Buk,Burg,Prodish,Prashnak,Ragar,Purag,Bugdish,Vigdish,Grogdish,Huol,Hank,Gruurk,Rak,Rudash,Ginak,Huol,Erigdush,Vraurk,Prool,Pragor,Grirag,Vishnak,Grorg,Eronk,Vraurk,Erishnak,Erunk,Bilo,Hodush,Vrork,Eriurk,Vrarbag,Hagar,Vorg,Pidush,Pigdish,Bidush,Prashnak,Virag,Bunk,Vrurg,Hong,Rik,Hirg,Rushnak,Gink,Hadish,Vilo,Vrork,Rak,Huk,Ronak,Vrulg,Vilg,Rogdish,Prodash,Erirt,Gragar,Gigor,Burag,Priol,Rodush,Rirg,Vruurk,Barag,Podish,Vunak,Hork,Grilg,Bogdish,Vadash,Raurk,Puurk,Rark,Ronak,Grogar,Hashnak,Bink,Grodish,Hidish,Bagar,Erinak,Vrugdush,Rarag,Eragdish,Hirag,Vrolo,Hogor,Erirbag,Vruol,Gulg,Pralo,Hogar,Hadush,Budush,Hadash,Gigor,Goshnak,Hugor,Hudash,Biol,Vrurg,Pradish,Pralg,Bilg,Vrart,Prunak,Prigdish,Vrung,Vrugdush,Grudash,Ging,Puk,Graol,Prigor,Buurk,Pagdish,Hirg,Prang,Eragor,Gralg,Prart,Vrolo,Prark,Pashnak,Pradish,Vilg,Pulo,Gunak,Paol,Gridash,Erirag,Bart,Burag,Vrinak,Vushnak,Prilo,Vragor,Rigor,Bung,Prourk,Vrork,Burg,Erugdush,Bogdish,Prurg,Prigor,Binak,Vadish,Grilo,Ruol,Vrodish,Pinak,Pradish,Eragor,Higdush,Parag,Pink,Vrong,Port,Bok,Porbag,Grilo,Bung,Grugar,Rak,Gulo,Grork,Bik,Grodish,Polg,Pung,Grarbag,Vurg,Vurbag,Pung,Prolo,Voshnak,Ruk,Vigdish,Vradash,Vrarg,Gong,Gragor,Varbag,Erogdush,Erorbag,Bidish,Prirt,Hadush,Rirk,Vrurt,Hing,Gronk,Rung,Girt,Gronk,Vigar,Prugar,Raol,Eronk,Hurk,Purg,Hilg,Vrudish,Grurk,Gigor,Grurg,Polg,Erurag,Erudush,Vadush,Vrulg,Varag,Huurk,Vadush,Grok,Rank,Bashnak,Praol,Vrarg,Grigor,Hank,Hool,Rang,Grolg,Hudish,Gashnak,Ragdish,Pidush,Pulg,Vring,Vurag,Vrurg,Rilg,Pigdush,Hagor"
|
||||
#enddef
|
||||
|
||||
#define DWARVISH_NAMES
|
||||
male_names="Althaas,Glamcatus,Trithaithis,Gomdrol,Andurus,Pelaithol,Trithaithus,Andris,Trithatsol,Gomcatis,Pelcatol,Augcatil,Alating,Augaithing,Anthaas,Gomaithsol,Trithaithas,Aigdris,Althalos,Analil,Trithdurol,Glamcatil,Augthail,Trithduril,Dulthalos,Glamthasol,Aldrsol,Glamaithol,Glamalil,Analus,Nardril,Augating,Dulaithsol,Aldrlos,Alalus,Aigcatsol,Ancatas,Trithdris,Pelatol,Aigthasil,Anthais,Narcatis,Trithatil,Aigaithing,Althail,Trithaithil,Naraithol,Duldrlos,Gomatas,Alcatis,Naraithsil,Althalos,Aigdursol,Glamalsil,Nardrus,Aigalis,Aldurlos,Augcatsil,Aigthaing,Augduril,Aigaithas,Anthais,Glamthaas,Dulcatsol,Gomatil,Gomcatlos,Augdrsil,Trithdril,Duldrsil,Duldrol,Peldrsol,Pelalsol,Gomthaas,Dulcatsil,Aigcating,Aldril,Glamcating,Anatsol,Augdris,Anthasol,Glamcatsil,Aldras,Aigatsol,Naraithol,Anthaus,Gomdrsil,Pelalis,Gomatlos,Narcating,Trithdrlos,Aigdrlos,Narcatsil,Glamdras,Aigthaing,Gomcatil,Andurus,Pelthail,Triththaus,Augalas,Alalol,Aigalas,Pelatis,Anating,Alaithsol,Andrus,Aigalsil,Dulatil,Aigdris,Augatsil,Glamduring,Trithduril,Trithdrsol,Alalus,Glamatus,Aldrol,Glamdril,Pelcatsil,Glamaithis,Trithdring,Peldril,Trithdurus,Gomaithil,Trithcatsol,Glamdrsol,Augthais,Dulaithlos,Althasil,Aigaithil,Andrlos,Dulatil,Dulalas,Dulatsol,Analol,Trithcatlos,Althasol,Alcatis,Glamduril,Peldursol,Pelalus,Glamthaas,Aldurol,Aigatsil,Aigatus,Trithduril,Pelaithsol,Aigcatis,Andursol,Naralsil,Althaol,Aldrsol,Dulalas,Triththaas,Augatol,Pelaling,Dulcatlos,Augduril,Glamthaol,Ancatus,Augcatol,Peldrus,Pelatil,Gomcatil,Anallos,Anaithing,Naraithsil,Aldris,Gomdris,Andril,Naratsil,Aigcating,Triththaas,Narduril,Aigdurlos,Aigaithol,Glamaithol,Pelatil,Nardris,Augthaol,Augatol,Glamallos,Anthaing,Aigcatis,Pelthasil,Dulcatil,Dulatol,Dulduring,Alalil,Peldrus,Gomdursil,Nardras,Peldril,Gomcatlos,Gomalis,Glamthaus,Duldurus,Dulcating,Anatol,Augdrsil,Analsil,Trithdrus,Augaithus,Trithaithsol,Aigcatus,Augaling,Alating,Glamatil,Anaithus,Gomatis,Augdris,Pelaithing,Augaithing,Gomdursol,Naraithus,Trithatsol,Ancatil,Glamaithil,Augdurus,Gomalus,Aigduras,Nardrol,Nardurol,Pelalil,Gomalil,Aigatis,Analil,Dulthaus,Gomaithil,Alduras,Trithduril,Ancatol,Alduras,Pelduril,Narcatsol,Pelating,Dulcatsil,Augatol,Glamthasil,Gomthasol,Naraithsil,Alatsil,Dulcatol,Gomthalos,Aigaling,Aigcatas,Pelalus,Augcatsil,Trithatas,Aigthais,Gomaithas,Alcatsil,Ancatus,Pelatis,Ancatas,Dulating,Gomdras,Naraithsol,Augcatis,Alaithis,Pelalsol,Duldursil,Pelcating,Dulaling,Gomating,Aigaithol,Alaithas,Peldras,Triththaing,Augdurol,Augaithas,Augcatsil,Glamdrlos,Peldurol,Aigdris,Pelaithas,Augcatas,Alalas,Anthaing,Naratlos,Augdursol,Gomdril,Dulcatlos,Anthasil,Triththasol,Naralus,Pelthaas,Augcatsil,Anaithis,Andurus,Gomdring,Glamduras,Pelalsil,Augthalos,Augduras,Pelaling,Gomalis,Augalol,Gomdris,Glamalis,Augdrus,Alatlos,Trithdril,Augthalos,Glamdril,Aigatlos,Alatas,Pelaithsol,Anthaus,Trithdril,Aldrsol,Triththail,Glamaithsol,Augduring,Aigthaus,Anaithsil,Pelatus,Naratol,Glamalsil,Trithcatus,Trithatil,Anallos,Augdras,Trithaithsil,Narduril,Dulatsol,Naralus,Narcatol,Alcatlos,Trithalol,Dulthasil,Andrus,Pelduring,Naraithil,Aigatsil,Trithdurlos,Augdursol,Trithaithol,Gomatol,Aigcatas,Pelcatlos,Glamduris,Anaithas,Peldurus,Glamduris,Naralil,Trithdursil,Pelthasil,Gomatis,Aldril,Augatol,Anaithus,Anatsol,Trithaithlos,Duldrus,Narduras,Dulaithlos,Duldris,Dulaithsil,Anthais,Gomduris,Narthalos,Ancatus,Anduril,Alaithol,Aigalis,Trithaithas,Aigcatil,Trithaithil,Naraithing,Augatsol,Trithaithol,Dulalsil,Dulthasol,Glamcatas,Glamthaol,Gomaithsol,Dulaithing,Naratlos,Naraithol,Gomthasol,Ancatas,Aigcatsil,Pelduris,Trithdrus,Andurus,Trithdring,Glamthaas,Aigcating,Nardrsol,Glamaithol,Dulaithsol,Althaus,Augduras,Aigaithas,Gomdurlos,Glamalus,Gomdrsil,Trithdrol,Pelating,Pelatus,Aigdrsol,Trithdurol,Glamaling,Dulduras,Dulating,Naraithing,Dulalis,Alaithus,Gomdurus,Glamcatus,Trithduring,Anatis,Anaithsil,Glamduril,Gomdursol,Narcatol,Trithaithis,Naratlos,Nardring,Aigalol,Althail,Anatas,Anthasol,Aigatus,Dulaithil,Althalos,Aldring,Glamalil,Anating,Aigdring,Duldril,Andurol,Pelaithsil,Gomdurus,Gomcatil,Glamthaas,Alalsol,Augdurus,Trithduril,Anthaol,Augalas,Pelcatol,Nardrsil,Alatil,Glamdrsol,Alaithlos,Pelatsil,Gomdurus,Dulatus,Alalsol,Glamaling,Dulatus,Alcatil,Aigthaus,Duldril,Pelaithlos,Pelaithis,Dulatil,Trithalis,Naraithol,Pelating,Augcatol,Gomatis,Andrus,Pelduris,Aigdrsil,Alatlos,Augdrsil,Anduril,Gomaithol,Glamdursol,Trithaithil,Gomdril,Glamcatil,Trithdrus,Naralas,Dulatol,Anaithil,Anatol,Augating,Peldursol,Narcatis,Glamatus,Aigaithas,Aigatas,Trithatlos,Gomatil,Gomthalos,Dulaling,Aigatsil,Augcatus,Trithaithus,Gomcatlos,Aigaithol,Naratsil,Narthaol,Narcatol,Augatlos,Pelaithil,Gomaithsol,Augaithsil"
|
||||
#enddef
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,7 +1,7 @@
|
|||
[scenario]
|
||||
name="The Bay of Pearls"
|
||||
map=map2
|
||||
turns=28
|
||||
turns=24
|
||||
|
||||
|
||||
{DAWN}
|
||||
|
@ -507,6 +507,14 @@ The main cage where they keep most of the mermen is in the south-east!"
|
|||
image=galleon.png
|
||||
[/item]
|
||||
|
||||
#if victorious, the player can henceforth recruit mermen
|
||||
[event]
|
||||
name=victory
|
||||
[allow_recruit]
|
||||
type=Merman
|
||||
[/allow_recruit]
|
||||
[/event]
|
||||
|
||||
#define BAY_OF_PEARLS_VICTORY
|
||||
[message]
|
||||
id=msg3_16
|
||||
|
|
|
@ -108,7 +108,7 @@ Defeat:
|
|||
[/recall]
|
||||
[message]
|
||||
id=msg1b_1
|
||||
description=Delfaldor
|
||||
description=Delfador
|
||||
message="We should be able to board a ship at Blackwater Port, but it seems the Orcs are heading there too. One of my old apprentices has settled in these lands - I am sure he will help us!"
|
||||
[/message]
|
||||
[message]
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
[scenario]
|
||||
name="Brother Against Brother"
|
||||
id=Brother_Against_Brother
|
||||
id="Brother_Against_Brother"
|
||||
map=undmap1
|
||||
turns=32
|
||||
turns=28
|
||||
|
||||
|
||||
{DUSK}
|
||||
|
@ -18,7 +18,7 @@
|
|||
{MORNING}
|
||||
{AFTERNOON}
|
||||
|
||||
next_scenario=Skull_Agarash
|
||||
next_scenario="Skull_Agarash"
|
||||
|
||||
music="wesnoth-2.ogg"
|
||||
|
||||
|
@ -49,6 +49,9 @@ Defeat:
|
|||
description=Nati Ha'atel
|
||||
side=2
|
||||
canrecruit=1
|
||||
#ifdef HARD
|
||||
recruit=Dark Adept,Ghost,Blood Bat,Skeleton,Boneshooter
|
||||
#else
|
||||
recruit=Dark Adept,Ghost,Walking Corpse,Vampire Bat,Skeleton,Skeleton Archer
|
||||
#ifdef EASY
|
||||
gold=120
|
||||
|
@ -68,32 +71,32 @@ Defeat:
|
|||
name=start
|
||||
|
||||
[message]
|
||||
id=und1_1
|
||||
id=msg2_1_1
|
||||
speaker=narrator
|
||||
message="As the sun set over a land far removed from the war that was happening in Wesnoth, a new war was brewing, between brothers..."
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_2
|
||||
id=msg2_1_2
|
||||
description=Gwiti Ha'atel
|
||||
message="Ah, hated brother mine. Look well upon the setting sun, for you shall not live to see another."
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_3
|
||||
id=msg2_1_3
|
||||
description=Nati Ha'atel
|
||||
message="I did not live to see this one either. I gave up my life for necromancy, same as you, do you remember?"
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_4
|
||||
id=msg2_1_4
|
||||
description=Gwiti Ha'atel
|
||||
message="How well I do. But either way, prepare to die... again."
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_5
|
||||
id=msg2_1_5
|
||||
description=Nati Ha'atel
|
||||
message="I will fight you with all my strength to prevent that, and I was always the stronger of us. Flee now and save your miserable hide before I make it a carpet."
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_6
|
||||
id=msg2_1_6
|
||||
description=Gwiti Ha'atel
|
||||
message="Don't be silly! I'm not hairy enough to be a carpet! But your scalp would make a good pillow."
|
||||
[/message]
|
||||
|
@ -106,17 +109,17 @@ Defeat:
|
|||
description=Gwiti Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=und1_7
|
||||
id=msg2_1_7
|
||||
speaker=unit
|
||||
message="What? I can't die! I've done so already! Noooo!"
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_8
|
||||
id=msg2_1_8
|
||||
description=Nati Ha'atel
|
||||
message="Ha ha ha, did I not tell you it would be so? Perhaps I shall summon your shade to serve me one day... Until then, farewell!"
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_9
|
||||
id=msg2_1_9
|
||||
speaker=unit
|
||||
message="It is over, I am doomed...."
|
||||
[/message]
|
||||
|
@ -131,18 +134,17 @@ Defeat:
|
|||
description=Nati Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=und1_10
|
||||
id=msg2_1_10
|
||||
speaker=unit
|
||||
message="I... have failed to win this battle, I am defeated. I will not believe it."
|
||||
[/message]
|
||||
[message]
|
||||
id=und1_11
|
||||
id=msg2_1_11
|
||||
description=Gwiti Ha'atel
|
||||
message="Die, yes die, and go to the Land of the Dead. Perhaps one day you will be back under my command!"
|
||||
[/message]
|
||||
[endlevel]
|
||||
result=victory
|
||||
bonus=yes
|
||||
[/endlevel]
|
||||
[/event]
|
||||
|
||||
|
@ -154,7 +156,7 @@ Defeat:
|
|||
description=Gwiti Ha'atel
|
||||
[/filter_second]
|
||||
[message]
|
||||
id=und1_12
|
||||
id=msg2_1_12
|
||||
speaker=second_unit
|
||||
message="Didn't I tell you so?!"
|
||||
[/message]
|
||||
|
@ -166,7 +168,7 @@ Defeat:
|
|||
description=Nati Ha'atel
|
||||
[/filter_second]
|
||||
[message]
|
||||
id=und1_13
|
||||
id=msg2_1_13
|
||||
speaker=second_unit
|
||||
message="And by my own hands you died!"
|
||||
[/message]
|
||||
|
@ -180,7 +182,7 @@ Defeat:
|
|||
description=Gwiti Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=und1_14
|
||||
id=msg2_1_14
|
||||
description=Gwiti Ha'atel
|
||||
message="I am Gwiti the Mighty, prepare to die!"
|
||||
[/message]
|
||||
|
@ -192,7 +194,7 @@ Defeat:
|
|||
description=Nati Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=und1_15
|
||||
id=msg2_1_15
|
||||
description=Nati Ha'atel
|
||||
message="Now you shall die!"
|
||||
[/message]
|
||||
|
|
|
@ -1,10 +1,19 @@
|
|||
[scenario]
|
||||
name="Crossroads"
|
||||
map=crossroads
|
||||
turns=28
|
||||
turns=24
|
||||
|
||||
id=Crossroads
|
||||
next_scenario=""
|
||||
next_scenario=The_Princess_of_Wesnoth
|
||||
|
||||
[bigmap]
|
||||
image=misc/map.png
|
||||
{DOT 128 297}
|
||||
{DOT 144 292}
|
||||
{DOT 154 284}
|
||||
{DOT 173 283}
|
||||
{CROSS 189 282}
|
||||
[/bigmap]
|
||||
|
||||
{DAWN}
|
||||
{MORNING}
|
||||
|
@ -20,8 +29,7 @@
|
|||
canrecruit=1
|
||||
controller=human
|
||||
hitpoints=80
|
||||
recruit=Elvish Scout,Elvish Hero,Elvish Fighter,Elvish Archer,Horseman,Mage,Elvish Shaman,Red Mage,Spearman,Swordsman,Duelist,Fencer,Elvish Captain,Elvish Ranger,Elvish Shyde,Thief,Rogue,Merman,Elvish Lord,White Mage,Mage of Light,Elvish Sharpshooter
|
||||
gold=800
|
||||
gold=100
|
||||
enemy=2,3
|
||||
[/side]
|
||||
|
||||
|
@ -33,15 +41,7 @@
|
|||
controller=ai
|
||||
canrecruit=1
|
||||
recruit=Orcish Grunt,Wolf Rider,Orcish Archer,Troll Whelp
|
||||
#ifdef HARD
|
||||
gold=400
|
||||
#endif
|
||||
#ifdef MEDIUM
|
||||
gold=320
|
||||
#endif
|
||||
#ifdef EASY
|
||||
gold=200
|
||||
#endif
|
||||
{GOLD 200 320 400}
|
||||
enemy=1
|
||||
[/side]
|
||||
|
||||
|
@ -53,18 +53,51 @@
|
|||
controller=ai
|
||||
canrecruit=1
|
||||
recruit=Orcish Grunt,Wolf Rider,Orcish Archer,Troll Whelp
|
||||
#ifdef HARD
|
||||
gold=400
|
||||
#endif
|
||||
#ifdef MEDIUM
|
||||
gold=320
|
||||
#endif
|
||||
#ifdef EASY
|
||||
gold=200
|
||||
#endif
|
||||
{GOLD 200 320 400}
|
||||
enemy=1
|
||||
[/side]
|
||||
|
||||
#signs at the crossroads for decoration
|
||||
[item]
|
||||
x=24
|
||||
y=18
|
||||
image=terrain/signpost.png
|
||||
[/item]
|
||||
|
||||
[event]
|
||||
name=start
|
||||
[recall]
|
||||
description=Delfador
|
||||
[/recall]
|
||||
[recall]
|
||||
description=Kalenz
|
||||
[/recall]
|
||||
[message]
|
||||
id=msgcrossroads3
|
||||
description=Delfador
|
||||
message="Here we come to the great cross-roads. We want to go North-East."
|
||||
[/message]
|
||||
[message]
|
||||
id=msgcrossroads4
|
||||
description=Kalenz
|
||||
message="Beware! These forests are not safe! Asheviere has hired Orcs to guard these roads, because of their strategic important. We shall have to fight to get by here."
|
||||
[/message]
|
||||
[message]
|
||||
id=msgcrossroads5
|
||||
description=Konrad
|
||||
message="Then fight we shall! Let it begin."
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=victory
|
||||
[message]
|
||||
description=Konrad
|
||||
id=msgcrossroads6
|
||||
message="Victory is ours men. Let us proceed North-East!"
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=moveto
|
||||
[filter]
|
||||
|
@ -80,26 +113,17 @@
|
|||
[unit]
|
||||
side=1
|
||||
type=Elvish Archer
|
||||
description=Archer
|
||||
description=Niodien
|
||||
x=27
|
||||
y=28
|
||||
[/unit]
|
||||
[message]
|
||||
id=msgcrossroads1
|
||||
description=Archer
|
||||
message="Stay on the path!"
|
||||
description=Nioden
|
||||
message="Stay on the path! The forests here are not safe!"
|
||||
[/message]
|
||||
#[kill]
|
||||
#description=Archer
|
||||
#[/kill]
|
||||
#[move_unit_fake]
|
||||
#type=Elvish Archer
|
||||
#x=27,27,26,26,25,25,24,24,23,23,22,22
|
||||
#y=28,28,28,28,29,29,29,29,29,29,28,28
|
||||
#[/move_unit_fake]
|
||||
[/event]
|
||||
|
||||
|
||||
[event]
|
||||
name=moveto
|
||||
[filter]
|
||||
|
@ -115,23 +139,15 @@
|
|||
[unit]
|
||||
side=1
|
||||
type=Elvish Fighter
|
||||
description=Fighter
|
||||
description=Loflar
|
||||
x=36
|
||||
y=26
|
||||
[/unit]
|
||||
[message]
|
||||
description=Loflar
|
||||
id=msgcrossroads2
|
||||
description=Fighter
|
||||
message="Stay out of the forrest!"
|
||||
message="Beware of the forest! There are many Orcs hiding there, preparing to ambush you!"
|
||||
[/message]
|
||||
#[kill]
|
||||
#description=Fighter
|
||||
#[/kill]
|
||||
#[move_unit_fake]
|
||||
#type=Elvish Fighter
|
||||
#x=36,36,35,35,35,35,35,35,35,35
|
||||
#y=26,26,27,27,28,28,29,29,30,30
|
||||
#[/move_unit_fake]
|
||||
[/event]
|
||||
|
||||
#define TRAP1 X Y S
|
||||
|
|
|
@ -139,7 +139,7 @@ Defeat:
|
|||
side=5
|
||||
canrecruit=1
|
||||
recruit=Elvish Fighter,Elvish Archer,Elvish Ranger
|
||||
recruitment_pattern=fighter,scout
|
||||
recruitment_pattern=fighter,archer
|
||||
gold=200
|
||||
enemy=2,3,4
|
||||
[/side]
|
||||
|
@ -150,7 +150,7 @@ Defeat:
|
|||
side=6
|
||||
canrecruit=1
|
||||
recruit=Elvish Shaman,Elvish Archer,Elvish Fighter
|
||||
recruitment_pattern=archer,fighter,scout
|
||||
recruitment_pattern=archer,fighter
|
||||
gold=200
|
||||
enemy=2,3,4
|
||||
[/side]
|
||||
|
|
|
@ -195,7 +195,7 @@ Defeat:
|
|||
[message]
|
||||
id=msg9_a6
|
||||
description=Li'sar
|
||||
message="They have made it away! I cannot believe it! We must make chase after them over the river! We will meet again, foul imposter!"
|
||||
message="I cannot believe it, they have made it away! We must make chase. After them men, let us cross the river too! We will meet again, foul imposter."
|
||||
[/message]
|
||||
|
||||
[message]
|
||||
|
|
|
@ -47,6 +47,7 @@ Defeat:
|
|||
hitpoints=45
|
||||
experience=0
|
||||
side=1
|
||||
gold=60
|
||||
canrecruit=1
|
||||
recruit=Elvish Scout,Elvish Fighter,Elvish Archer,Horseman,Mage,Elvish Shaman
|
||||
enemy=2
|
||||
|
@ -62,17 +63,7 @@ Defeat:
|
|||
canrecruit=1
|
||||
recruit=Orcish Grunt,Wolf Rider,Orcish Archer,Troll Whelp
|
||||
recruitment_pattern=scout,scout,fighter,fighter,archer
|
||||
#ifdef HARD
|
||||
gold=240
|
||||
#endif
|
||||
|
||||
#ifdef NORMAL
|
||||
gold=120
|
||||
#endif
|
||||
|
||||
#ifdef EASY
|
||||
gold=60
|
||||
#endif
|
||||
{GOLD 60 120 240}
|
||||
enemy=1
|
||||
[/side]
|
||||
|
||||
|
@ -85,6 +76,7 @@ Defeat:
|
|||
y=8,9,10
|
||||
[/filter]
|
||||
[message]
|
||||
id=return_to_vessel
|
||||
description=Konrad
|
||||
message="This is no time to return to our vessel! We must take control of the island!"
|
||||
[/message]
|
||||
|
@ -181,7 +173,7 @@ Defeat:
|
|||
[message]
|
||||
id=msg2_7
|
||||
description=Konrad
|
||||
message="It was our duty, friend. I hope you will grant us refuge here now"
|
||||
message="It was our duty, friend. I hope you will grant us refuge here now."
|
||||
[/message]
|
||||
|
||||
[message]
|
||||
|
|
|
@ -136,6 +136,7 @@ Defeat:
|
|||
name=enemies defeated
|
||||
[command]
|
||||
[message]
|
||||
id=isle_wrested_control
|
||||
description=Konrad
|
||||
message="We have wrested control of the island from the evil undead! Now all we have to do is wait for the ship to arrive, so we can make our way to Elensefar!"
|
||||
[/message]
|
||||
|
@ -150,6 +151,7 @@ Defeat:
|
|||
{ISLE_GALLEON_ARRIVE}
|
||||
[command]
|
||||
[message]
|
||||
id=isle_damned_found1
|
||||
speaker=narrator
|
||||
image=elvish-fighter.png
|
||||
message="Thank goodness we have found you, sir! Come aboard quickly, we shall take you away from this horrible island!"
|
||||
|
@ -157,6 +159,7 @@ Defeat:
|
|||
[/command]
|
||||
[command]
|
||||
[message]
|
||||
id=isle_damned_found2
|
||||
description=Konrad
|
||||
message="It is a shame complete victory could not be ours, but thank goodness I am rescued! On to Elensefar!"
|
||||
[/message]
|
||||
|
|
|
@ -157,7 +157,7 @@ Defeat:
|
|||
[/terrain]
|
||||
[message]
|
||||
description=Konrad
|
||||
msg=nw_8
|
||||
id=msg_nw_8
|
||||
message="More snow is falling. We must finish this battle quickly. Onward men!"
|
||||
[/message]
|
||||
[/event]
|
||||
|
|
|
@ -17,13 +17,12 @@
|
|||
{FIRST_WATCH}
|
||||
{SECOND_WATCH}
|
||||
|
||||
id=The_Princess_of_Wesnoth
|
||||
next_scenario=The_Valley_of_Death-The_Princesss_Revenge
|
||||
|
||||
id=The_Princess_of_Wesnoth
|
||||
next_scenario=The_Valley_of_Death-The_Princesss_Revenge
|
||||
music="wesnoth-2.ogg"
|
||||
|
||||
music="wesnoth-2.ogg"
|
||||
|
||||
objectives="
|
||||
objectives="
|
||||
Victory:
|
||||
@Force Li'sar's surrender
|
||||
Defeat:
|
||||
|
@ -32,19 +31,15 @@ Defeat:
|
|||
#Death of Kalenz
|
||||
#Turns run out"
|
||||
|
||||
[bigmap]
|
||||
image=misc/map.png
|
||||
{DOT 128 297}
|
||||
{DOT 144 292}
|
||||
{DOT 154 284}
|
||||
{DOT 173 283}
|
||||
{DOT 189 282}
|
||||
{DOT 205 282}
|
||||
{DOT 219 280}
|
||||
{DOT 231 274}
|
||||
{DOT 240 270}
|
||||
{CROSS 250 264}
|
||||
[/bigmap]
|
||||
[bigmap]
|
||||
image=misc/map.png
|
||||
{DOT 189 282}
|
||||
{DOT 205 282}
|
||||
{DOT 219 280}
|
||||
{DOT 231 274}
|
||||
{DOT 240 270}
|
||||
{CROSS 250 264}
|
||||
[/bigmap]
|
||||
|
||||
[side]
|
||||
race=Elves
|
||||
|
@ -110,16 +105,21 @@ Defeat:
|
|||
message="The Queen has sent me to stop you, you imposter!"
|
||||
[/message]
|
||||
[message]
|
||||
id=msg6_3
|
||||
id=msg6_3
|
||||
role=Advisor
|
||||
message="That's the princess, Li'sar. The daughter of the Queen, and her successor!"
|
||||
[/message]
|
||||
[message]
|
||||
id=msg6_4
|
||||
id=msg6_4
|
||||
description=Konrad
|
||||
message="I'm no imposter, it seems that your mother has lied to you about it."
|
||||
[/message]
|
||||
[message]
|
||||
id=msg6_4b
|
||||
description=Li'sar
|
||||
message=Don't tell me such treason. Your lies will perish with you!
|
||||
[/message]
|
||||
[message]
|
||||
id=msg6_5
|
||||
description=Delfador
|
||||
message=It's no use reasoning. There is only one thing she will understand. To arms!
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
{SECOND_WATCH}
|
||||
|
||||
id=The_Siege_of_Elensefar
|
||||
next_scenario=The_Princess_of_Wesnoth
|
||||
next_scenario=Crossroads
|
||||
|
||||
music="wesnoth-2.ogg"
|
||||
|
||||
|
|
|
@ -119,15 +119,28 @@ Defeat
|
|||
[/message]
|
||||
[/event]
|
||||
|
||||
#define SWAMP_GET_GOLD AMOUNT
|
||||
[command]
|
||||
[gold]
|
||||
side=1
|
||||
amount={AMOUNT}
|
||||
[/gold]
|
||||
[/command]
|
||||
[command]
|
||||
[message]
|
||||
id=msg_get_gold_swamp
|
||||
speaker=narrator
|
||||
message=You loot {AMOUNT} pieces of gold from the corpse!
|
||||
[/message]
|
||||
[/command]
|
||||
#enddef
|
||||
|
||||
[event]
|
||||
name=die
|
||||
[filter]
|
||||
description=Clarustus
|
||||
[/filter]
|
||||
[gold]
|
||||
side=1
|
||||
amount=100
|
||||
[/gold]
|
||||
{SWAMP_GET_GOLD 100}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
@ -135,10 +148,7 @@ Defeat
|
|||
[filter]
|
||||
description=Merlunius
|
||||
[/filter]
|
||||
[gold]
|
||||
side=1
|
||||
amount=100
|
||||
[/gold]
|
||||
{SWAMP_GET_GOLD 100}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
@ -146,10 +156,7 @@ Defeat
|
|||
[filter]
|
||||
description=Aimucasur
|
||||
[/filter]
|
||||
[gold]
|
||||
side=1
|
||||
amount=150
|
||||
[/gold]
|
||||
{SWAMP_GET_GOLD 150}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
@ -157,10 +164,7 @@ Defeat
|
|||
[filter]
|
||||
description=Secadius
|
||||
[/filter]
|
||||
[gold]
|
||||
side=1
|
||||
amount=100
|
||||
[/gold]
|
||||
{SWAMP_GET_GOLD 100}
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
|
@ -168,9 +172,6 @@ Defeat
|
|||
[filter]
|
||||
description=Dafeis
|
||||
[/filter]
|
||||
[gold]
|
||||
side=1
|
||||
amount=100
|
||||
[/gold]
|
||||
{SWAMP_GET_GOLD 100}
|
||||
[/event]
|
||||
[/scenario]
|
||||
|
|
|
@ -1,21 +1,15 @@
|
|||
[scenario]
|
||||
name="The Skull of Agarash"
|
||||
map=undmap1
|
||||
turns=28
|
||||
map=undmap2
|
||||
turns=32
|
||||
|
||||
|
||||
{DUSK}
|
||||
{DUSK}
|
||||
{FIRST_WATCH}
|
||||
{FIRST_WATCH}
|
||||
{FIRST_WATCH}
|
||||
{SECOND_WATCH}
|
||||
{SECOND_WATCH}
|
||||
{SECOND_WATCH}
|
||||
{DAWN}
|
||||
{DAWN}
|
||||
{MORNING}
|
||||
{AFTERNOON}
|
||||
{DUSK}
|
||||
{FIRST_WATCH}
|
||||
{SECOND_WATCH}
|
||||
{DAWN}
|
||||
|
||||
id="Skull_Agarash"
|
||||
next_scenario=null
|
||||
|
@ -36,7 +30,7 @@ Defeat:
|
|||
side=1
|
||||
canrecruit=1
|
||||
controller=human
|
||||
recruit=Dark Adept,Ghost,Walking Corpse,Vampire Bat,Skeleton,Skeleton Archer
|
||||
recruit= Dark Adept,Ghost,Walking Corpse,Skeleton,Skeleton Archer
|
||||
enemy=2
|
||||
gold=120
|
||||
[/side]
|
||||
|
@ -58,7 +52,7 @@ Defeat:
|
|||
|
||||
[side]
|
||||
race=Orcs
|
||||
type=Dark Apprentice
|
||||
type=Orcish Warrior
|
||||
description=Isidal B'Tai
|
||||
side=3
|
||||
canrecruit=1
|
||||
|
@ -78,7 +72,7 @@ Defeat:
|
|||
|
||||
[side]
|
||||
race=Orcs
|
||||
type=Dark Apprentice
|
||||
type=Orcish Warrior
|
||||
description=Nakur Kimoni
|
||||
side=4
|
||||
canrecruit=1
|
||||
|
@ -98,47 +92,62 @@ Defeat:
|
|||
|
||||
[event]
|
||||
name=start
|
||||
[command]
|
||||
[message]
|
||||
id=und2_2_1
|
||||
speaker=narrator
|
||||
message="After Gwiti destroyed his brother, he was planning a march upon Wesnoth. But a Dark Spirit came to him, counselling him..."
|
||||
[/message]
|
||||
[/command]
|
||||
|
||||
[message]
|
||||
id=msg2_1
|
||||
speaker=narrator
|
||||
message="After Gwiti destroyed his brother, he was planning a march upon Wesnoth. But a Dark Spirit came to him, counselling him..."
|
||||
[/message]
|
||||
[message]
|
||||
id=msg2_2
|
||||
description=Dark Spirit
|
||||
message="Gwiitii... Gwiti!"
|
||||
[/message]
|
||||
[message]
|
||||
id=msg2_3
|
||||
description=Gwiti Ha'atel
|
||||
message="A Dark Spirit? Surely this is my token of mastery of the undead!"
|
||||
[/message]
|
||||
[message]
|
||||
id=msg2_4
|
||||
description=Dark Spirit
|
||||
message="Gwiti, do not yet march upon Wesnoth. First, you shall go north, and there find the Skull of Agarash."
|
||||
[/message]
|
||||
[message]
|
||||
id=msg2_5
|
||||
description=Gwiti Ha'atel
|
||||
message="What is the Skull of Agarash? Tell me more."
|
||||
[/message]
|
||||
[message]
|
||||
id=msg2_6
|
||||
description=Dark Spirit
|
||||
message="Do you see the three orc clans of this land? Their banners are topped with skulls, as is their custom. But one of these is the Skull of Agarash - which once was mine. Take it and your power will grow greater by far."
|
||||
[/message]
|
||||
[command]
|
||||
[move_unit_fake]
|
||||
type=Wraith
|
||||
x=1,2,3,4,5,6,7
|
||||
y=4,4,4,4,4,4,4
|
||||
[/move_unit_fake]
|
||||
[/command]
|
||||
|
||||
[command]
|
||||
[unit]
|
||||
description=Dark Spirit
|
||||
type=Wraith
|
||||
x=7
|
||||
y=4
|
||||
side=1
|
||||
[/unit]
|
||||
[/command]
|
||||
|
||||
[command]
|
||||
[message]
|
||||
id=und2_2_2
|
||||
description=Dark Spirit
|
||||
message="Gwiti... Gwiti!"
|
||||
[/message]
|
||||
[message]
|
||||
id=und2_2_3
|
||||
description=Gwiti Ha'atel
|
||||
message="A Dark Spirit? Surely this is my token of mastery of the undead!"
|
||||
[/message]
|
||||
[message]
|
||||
id=und2_2_4
|
||||
description=Dark Spirit
|
||||
message="Gwiti, do not yet march upon Wesnoth. First, you shall go south, against the orcs, and there find the Skull of Agarash."
|
||||
[/message]
|
||||
[message]
|
||||
id=und2_2_5
|
||||
description=Gwiti Ha'atel
|
||||
message="What is the Skull of Agarash? Tell me more."
|
||||
[/message]
|
||||
[message]
|
||||
id=und2_2_6
|
||||
description=Dark Spirit
|
||||
message="Do you see the three orc clans of this land? Their banners are topped with skulls, as is their custom. But one of these is the Skull of Agarash - which once was mine. Take it and your power will grow greater by far."
|
||||
[/message]
|
||||
[/command]
|
||||
[/event]
|
||||
|
||||
[event]
|
||||
name=turn 4
|
||||
[message]
|
||||
id=msg2_7
|
||||
description=Konrad
|
||||
message="Haha, some of the orcish clans are fighting each other!"
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
|
||||
[event]
|
||||
name=die
|
||||
|
@ -146,7 +155,7 @@ Defeat:
|
|||
description=Gwiti Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=msg2_8
|
||||
id=und2_2_8
|
||||
speaker=unit
|
||||
message="What? I can't die! I've done so already! Noooo!"
|
||||
[/message]
|
||||
|
@ -161,14 +170,19 @@ Defeat:
|
|||
description=Karz Gholum
|
||||
[/filter]
|
||||
[message]
|
||||
id=msg2_9
|
||||
id=und2_2_9
|
||||
speaker=unit
|
||||
message="Oh no! They undead hordes have taken my banner!"
|
||||
[/message]
|
||||
[/message]
|
||||
[message]
|
||||
id=msg2_10
|
||||
id=und2_2_10
|
||||
description=Gwiti Ha'atel
|
||||
message="It is not your banner, and it never was! That skull marked it mine since long ago."
|
||||
[/message]
|
||||
[message]
|
||||
id=und2_2_11
|
||||
description=Gwiti Ha'atel
|
||||
message="Argh! This is only half of the skull!"
|
||||
[/message]
|
||||
[endlevel]
|
||||
result=victory
|
||||
|
@ -182,7 +196,7 @@ Defeat:
|
|||
description=Nakur Kimoni
|
||||
[/filter]
|
||||
[message]
|
||||
id=msg2_11
|
||||
id=und2_2_12
|
||||
description=Gwiti Ha'atel
|
||||
message="This skull is powerless!"
|
||||
[/message]
|
||||
|
@ -194,7 +208,7 @@ Defeat:
|
|||
description=Isidal B'tai
|
||||
[/filter]
|
||||
[message]
|
||||
id=msg2_12
|
||||
id=und2_2_13
|
||||
description=Gwiti Ha'atel
|
||||
message="That is not the skull of Agarash!"
|
||||
[/message]
|
||||
|
@ -207,9 +221,9 @@ Defeat:
|
|||
description=Gwiti Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=msg2_13
|
||||
id=und2_14
|
||||
speaker=unit
|
||||
message="I am dying, and mya rmy is defeated! This is the end...!"
|
||||
message="I am dying, and my army is defeated! This is the end...!"
|
||||
[/message]
|
||||
[endlevel]
|
||||
result=defeat
|
||||
|
@ -225,9 +239,9 @@ Defeat:
|
|||
description=Gwiti Ha'atel
|
||||
[/filter]
|
||||
[message]
|
||||
id=msg2_14
|
||||
id=und2_2_15
|
||||
description=Gwiti Ha'atel
|
||||
message="I am Gwiti the Mighty, prepare to die!"
|
||||
message="It's been a long time since I fought anything myself!"
|
||||
[/message]
|
||||
[/event]
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ image=horseman.png
|
|||
hitpoints=38
|
||||
movement_type=mounted
|
||||
movement=8
|
||||
experience=38
|
||||
experience=44
|
||||
level=1
|
||||
alignment=lawful
|
||||
advanceto=Knight
|
||||
|
|
|
@ -31,7 +31,7 @@ get_hit_sound=groan.wav
|
|||
type=holy
|
||||
range=long
|
||||
special=magical
|
||||
damage=10
|
||||
damage=11
|
||||
number=4
|
||||
[missile_frame]
|
||||
begin=-100
|
||||
|
|
|
@ -5,11 +5,11 @@ image=undead-bat.png
|
|||
hitpoints=16
|
||||
movement_type=undeadfly
|
||||
movement=8
|
||||
experience=10
|
||||
experience=14
|
||||
level=0
|
||||
alignment=chaotic
|
||||
advanceto=Blood Bat
|
||||
cost=8
|
||||
cost=11
|
||||
usage=scout
|
||||
unit_description="An undead flying beast, it attacks by biting its target. While the Vampire Bat fangs are not very powerful, they drain the blood of the victim, giving some of its health to the monster."
|
||||
get_hit_sound=groan.wav
|
||||
|
|
BIN
images/icon.png
Normal file
BIN
images/icon.png
Normal file
Binary file not shown.
|
@ -53,12 +53,15 @@ void pump()
|
|||
|
||||
static std::pair<int,int> resize_dimensions(0,0);
|
||||
|
||||
//used to keep track of double click events
|
||||
static int last_mouse_down = -1;
|
||||
static int last_click_x = -1, last_click_y = -1;
|
||||
|
||||
SDL_Event event;
|
||||
while(SDL_PollEvent(&event)) {
|
||||
//events may cause more event handlers to be added and/or removed,
|
||||
//so we must use indexes instead of iterators here.
|
||||
for(size_t i1 = 0, i2 = event_handlers.size(); i1 != i2; ++i1) {
|
||||
assert(i1 < event_handlers.size());
|
||||
for(size_t i1 = 0, i2 = event_handlers.size(); i1 != i2 && i1 < event_handlers.size(); ++i1) {
|
||||
event_handlers[i1]->handle_event(event);
|
||||
}
|
||||
|
||||
|
@ -77,10 +80,32 @@ void pump()
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
//mouse wheel support
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN: {
|
||||
if(event.button.button == 4) {
|
||||
|
||||
if(event.button.button == SDL_BUTTON_LEFT) {
|
||||
static const int DoubleClickTime = 500;
|
||||
|
||||
static const int DoubleClickMaxMove = 3;
|
||||
const int current_ticks = ::SDL_GetTicks();
|
||||
if(last_mouse_down >= 0 && current_ticks - last_mouse_down < DoubleClickTime &&
|
||||
abs(event.button.x - last_click_x) < DoubleClickMaxMove &&
|
||||
abs(event.button.y - last_click_y) < DoubleClickMaxMove) {
|
||||
SDL_UserEvent user_event;
|
||||
user_event.type = DOUBLE_CLICK_EVENT;
|
||||
user_event.code = 0;
|
||||
user_event.data1 = reinterpret_cast<void*>(event.button.x);
|
||||
user_event.data2 = reinterpret_cast<void*>(event.button.y);
|
||||
::SDL_PushEvent(reinterpret_cast<SDL_Event*>(&user_event));
|
||||
}
|
||||
|
||||
last_mouse_down = current_ticks;
|
||||
last_click_x = event.button.x;
|
||||
last_click_y = event.button.y;
|
||||
}
|
||||
|
||||
//mouse wheel support
|
||||
else if(event.button.button == 4) {
|
||||
gui::scroll_dec();
|
||||
} else if(event.button.button == 5) {
|
||||
gui::scroll_inc();
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
|
||||
#include "SDL.h"
|
||||
|
||||
//our user-defined double-click event type
|
||||
#define DOUBLE_CLICK_EVENT SDL_USEREVENT
|
||||
|
||||
namespace events
|
||||
{
|
||||
|
||||
|
|
|
@ -81,18 +81,7 @@ void get_files_in_dir(const std::string& directory,
|
|||
#endif
|
||||
|
||||
if(DIR_INVALID(dir)) {
|
||||
//try to make the directory
|
||||
const int res = mkdir(directory.c_str(),AccessMode);
|
||||
if(res == 0) {
|
||||
#ifdef _WIN32
|
||||
dir = _findfirst((directory + "/*.*").c_str(),&fileinfo);
|
||||
#else
|
||||
dir = opendir(directory.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
if(DIR_INVALID(dir))
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
|
34
src/game.cpp
34
src/game.cpp
|
@ -229,7 +229,7 @@ int play_game(int argc, char** argv)
|
|||
|
||||
int video_flags = preferences::fullscreen() ? FULL_SCREEN : 0;
|
||||
|
||||
const std::pair<int,int>& resolution = preferences::resolution();
|
||||
std::pair<int,int> resolution = preferences::resolution();
|
||||
|
||||
std::cerr << "checking mode possible...\n";
|
||||
const int bpp = video.modePossible(resolution.first,resolution.second,
|
||||
|
@ -238,18 +238,32 @@ int play_game(int argc, char** argv)
|
|||
std::cerr << bpp << "\n";
|
||||
|
||||
if(bpp == 0) {
|
||||
std::cerr << "The required video mode, " << resolution.first
|
||||
<< "x" << resolution.second << "x16 "
|
||||
<< "is not supported\n";
|
||||
//Video mode not supported, maybe from bad prefs.
|
||||
std::cerr << "The video mode, " << resolution.first
|
||||
<< "x" << resolution.second << "x16 "
|
||||
<< "is not supported\nAttempting 1024x768x16...\n";
|
||||
|
||||
//Attempt 1024x768.
|
||||
resolution.first = 1024;
|
||||
resolution.second = 768;
|
||||
|
||||
if((video_flags&FULL_SCREEN) != 0 && argc == 0)
|
||||
std::cerr << "Try running the program with the -windowed option "
|
||||
<< "using a 16bpp X windows setting\n";
|
||||
const int bpp = video.modePossible(resolution.first,resolution.second,16,video_flags);
|
||||
if(bpp == 0) {
|
||||
//couldn't do 1024x768 either
|
||||
|
||||
if((video_flags&FULL_SCREEN) == 0 && argc == 0)
|
||||
std::cerr << "Try running with the -fullscreen option\n";
|
||||
std::cerr << "The required video mode, " << resolution.first
|
||||
<< "x" << resolution.second << "x16 "
|
||||
<< "is not supported\n";
|
||||
|
||||
return 0;
|
||||
if((video_flags&FULL_SCREEN) != 0 && argc == 0)
|
||||
std::cerr << "Try running the program with the -windowed option "
|
||||
<< "using a 16bpp X windows setting\n";
|
||||
|
||||
if((video_flags&FULL_SCREEN) == 0 && argc == 0)
|
||||
std::cerr << "Try running with the -fullscreen option\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(bpp != 16) {
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace game_config
|
|||
const int cure_amount = 8;
|
||||
const int curer_heals_per_turn = 18;
|
||||
const int recall_cost = 20;
|
||||
const std::string version = "0.6RC3";
|
||||
const std::string version = "0.6";
|
||||
bool debug = false;
|
||||
|
||||
#ifdef WESNOTH_PATH
|
||||
|
|
|
@ -233,6 +233,50 @@ void event_handler::handle_event(const queued_event& event_info, const config* c
|
|||
handle_event(event_info,*i);
|
||||
}
|
||||
|
||||
//reveal sections of the map that would otherwise be under shroud
|
||||
const config::child_list& remove_shroud = cfg->get_children("remove_shroud");
|
||||
for(i = remove_shroud.begin(); i != remove_shroud.end(); ++i) {
|
||||
const size_t index = maximum<int>(1,atoi((**i)["side"].c_str())) - 1;
|
||||
if(index < teams->size()) {
|
||||
const std::vector<gamemap::location>& locs = multiple_locs(**i);
|
||||
for(std::vector<gamemap::location>::const_iterator j = locs.begin(); j != locs.end(); ++j) {
|
||||
(*teams)[index].clear_shroud(j->x,j->y);
|
||||
}
|
||||
}
|
||||
|
||||
screen->invalidate_all();
|
||||
}
|
||||
|
||||
|
||||
//teleport a unit from one location to another
|
||||
const config::child_list& teleports = cfg->get_children("teleport");
|
||||
for(i = teleports.begin(); i != teleports.end(); ++i) {
|
||||
|
||||
//search for a valid unit filter, and if we have one, look for the matching unit
|
||||
const config* const filter = (*i)->child("filter");
|
||||
if(filter != NULL) {
|
||||
unit_map::iterator u;
|
||||
for(u = units->begin(); u != units->end(); ++u){
|
||||
if(u->second.matches_filter(*filter))
|
||||
break;
|
||||
}
|
||||
|
||||
//we have found a unit that matches the filter
|
||||
if(u != units->end()) {
|
||||
const gamemap::location dst(**i);
|
||||
if(game_map->on_board(dst)) {
|
||||
const gamemap::location vacant_dst = find_vacant_tile(*game_map,*units,dst,(*game_map)[dst.x][dst.y]);
|
||||
if(game_map->on_board(vacant_dst)) {
|
||||
//note that inserting into a map does NOT invalidate iterators
|
||||
//into the map, so this sequence is fine.
|
||||
units->insert(std::pair<gamemap::location,unit>(vacant_dst,u->second));
|
||||
units->erase(u);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//allow a side to recruit a new type of unit
|
||||
const config::child_list& allow_recruit = cfg->get_children("allow_recruit");
|
||||
for(i = allow_recruit.begin(); i != allow_recruit.end(); ++i) {
|
||||
|
|
|
@ -135,11 +135,11 @@ manager::~manager()
|
|||
void set_wm_icon()
|
||||
{
|
||||
//this code seems to only display the top part of the icon in Windows XP
|
||||
// SDL_Surface* const icon = scale_surface(get_image("icon.png",UNSCALED),32,32);
|
||||
// if(icon != NULL) {
|
||||
// std::cerr << "setting icon...\n";
|
||||
// ::SDL_WM_SetIcon(icon,NULL);
|
||||
// }
|
||||
SDL_Surface* const icon = get_image("icon.png",UNSCALED);
|
||||
if(icon != NULL) {
|
||||
std::cerr << "setting icon...\n";
|
||||
::SDL_WM_SetIcon(icon,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void set_pixel_format(SDL_PixelFormat* format)
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
SDL_CFLAGS = `sdl-config --cflags` `freetype-config --cflags`
|
||||
SDL_LIBS = `sdl-config --libs` -lSDL_ttf -lSDL_mixer -lSDL_image -lSDL_net `freetype-config --libs`
|
||||
OBJS= editor.o ../actions.o ../ai.o ../ai_attack.o ../ai_move.o ../config.o ../dialogs.o ../display.o ../events.o ../filesystem.o ../font.o ../game_config.o ../game_events.o ../gamestatus.o ../hotkeys.o ../image.o ../intro.o ../key.o ../language.o ../log.o ../map.o ../show_dialog.o ../mouse.o ../network.o ../pathfind.o ../playlevel.o ../playturn.o ../preferences.o ../replay.o ../sdl_utils.o ../sound.o ../team.o ../terrain.o ../tooltips.o ../unit.o ../unit_types.o ../video.o ../widgets/button.o ../widgets/menu.o ../widgets/textbox.o ../widgets/slider.o
|
||||
|
||||
editor: $(OBJS)
|
||||
gcc -lstdc++ ${SDL_CFLAGS} -o $@ ${OBJS} ${SDL_LIBS}
|
||||
|
||||
.cpp.o:
|
||||
gcc ${SDL_CFLAGS} -c $< -o $*.o
|
||||
|
||||
clean:
|
||||
-rm -f *.o ../*.o editor
|
|
@ -1,171 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2003 by David White <davidnwhite@optusnet.com.au>
|
||||
Part of the Battle for Wesnoth Project http://wesnoth.whitevine.net
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY.
|
||||
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
#include "SDL.h"
|
||||
#include "SDL_keysym.h"
|
||||
|
||||
#include "../actions.hpp"
|
||||
#include "../ai.hpp"
|
||||
#include "../config.hpp"
|
||||
#include "../dialogs.hpp"
|
||||
#include "../display.hpp"
|
||||
#include "../events.hpp"
|
||||
#include "../font.hpp"
|
||||
#include "../game_config.hpp"
|
||||
#include "../gamestatus.hpp"
|
||||
#include "../key.hpp"
|
||||
#include "../language.hpp"
|
||||
#include "../widgets/menu.hpp"
|
||||
#include "../pathfind.hpp"
|
||||
#include "../playlevel.hpp"
|
||||
#include "../team.hpp"
|
||||
#include "../unit_types.hpp"
|
||||
#include "../unit.hpp"
|
||||
#include "../video.hpp"
|
||||
|
||||
#include <cctype>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
|
||||
// I just not have time now to search if there are any versions
|
||||
// of SDL that needs uppercase. So both is supported... --Sofronius
|
||||
#ifndef SDLK_X
|
||||
#define SDLK_X SDLK_x
|
||||
#define SDLK_D SDLK_d
|
||||
#define SDLK_Z SDLK_z
|
||||
#endif
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
const double scroll_speed = 30.0;
|
||||
const double zoom_amount = 5.0;
|
||||
|
||||
if(argc == 1) {
|
||||
std::cout << "usage: " << argv[0] << " map-name\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
preproc_map defines_map;
|
||||
defines_map["MEDIUM"] = preproc_symbol;
|
||||
config cfg(preprocess_file("data/game.cfg",&defines_map));
|
||||
|
||||
set_language("English", cfg);
|
||||
|
||||
std::cout << "a\n";
|
||||
std::string mapdata = read_file(argv[1]);
|
||||
if(mapdata.empty()) {
|
||||
for(int i = 0; i != 30; ++i) {
|
||||
mapdata = mapdata + "gggggggggggggggggggggggggggggggggggggg\n";
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "b\n";
|
||||
gamemap map(cfg,mapdata);
|
||||
|
||||
CVideo video;
|
||||
|
||||
video.setMode(1024,768,16,0);
|
||||
|
||||
CKey key;
|
||||
gamestatus status(cfg,0);
|
||||
std::vector<team> teams;
|
||||
|
||||
std::map<gamemap::location,unit> units;
|
||||
display gui(units,video,map,status,teams);
|
||||
gui.draw_terrain_palette(gui.mapx()+10,142,0);
|
||||
|
||||
gamemap::TERRAIN selected_terrain = 0;
|
||||
|
||||
bool first_time = true;
|
||||
|
||||
const font::manager font_manager;
|
||||
|
||||
std::cerr << "starting for(;;)\n";
|
||||
for(;;) {
|
||||
if(key[SDLK_ESCAPE])
|
||||
break;
|
||||
|
||||
int mousex, mousey;
|
||||
const int mouse_flags = SDL_GetMouseState(&mousex,&mousey);
|
||||
const bool new_left_button = mouse_flags & SDL_BUTTON_LMASK;
|
||||
const bool new_right_button = mouse_flags & SDL_BUTTON_RMASK;
|
||||
|
||||
if(key[SDLK_UP] || mousey == 0)
|
||||
gui.scroll(0.0,-scroll_speed);
|
||||
|
||||
if(key[SDLK_DOWN] || mousey == gui.y()-1)
|
||||
gui.scroll(0.0,scroll_speed);
|
||||
|
||||
if(key[SDLK_LEFT] || mousex == 0)
|
||||
gui.scroll(-scroll_speed,0.0);
|
||||
|
||||
if(key[SDLK_RIGHT] || mousex == gui.x()-1)
|
||||
gui.scroll(scroll_speed,0.0);
|
||||
|
||||
if(key[SDLK_Z])
|
||||
gui.zoom(zoom_amount);
|
||||
|
||||
if(key[SDLK_X])
|
||||
gui.zoom(-zoom_amount);
|
||||
|
||||
if(key[SDLK_D])
|
||||
gui.default_zoom();
|
||||
|
||||
gui.highlight_hex(gui.hex_clicked_on(mousex,mousey));
|
||||
if(new_left_button) {
|
||||
const gamemap::TERRAIN terrain_on =
|
||||
gui.get_terrain_on(gui.mapx()+10,142,mousex,mousey);
|
||||
if(terrain_on && terrain_on != selected_terrain) {
|
||||
selected_terrain = terrain_on;
|
||||
gui.draw_terrain_palette(gui.mapx()+10,142,selected_terrain);
|
||||
}
|
||||
|
||||
const gamemap::location hex = gui.hex_clicked_on(mousex,mousey);
|
||||
if(map.on_board(hex)) {
|
||||
const gamemap::TERRAIN terrain = map[hex.x][hex.y];
|
||||
if(selected_terrain && selected_terrain != terrain) {
|
||||
map.set_terrain(hex,selected_terrain);
|
||||
gui.recalculate_minimap();
|
||||
|
||||
gamemap::location locs[7];
|
||||
locs[0] = hex;
|
||||
get_adjacent_tiles(hex,locs+1);
|
||||
for(int i = 0; i != 7; ++i) {
|
||||
gui.draw_tile(locs[i].x,locs[i].y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gui.draw();
|
||||
|
||||
if(first_time) {
|
||||
std::cerr << "drawing terrain pallette...\n";
|
||||
gui.draw_terrain_palette(gui.mapx()+10,142,0);
|
||||
first_time = false;
|
||||
}
|
||||
|
||||
SDL_Delay(20);
|
||||
events::pump();
|
||||
}
|
||||
|
||||
system("pwd");
|
||||
int res = gui::show_dialog(gui,NULL,"Save?","Do you want to save changes?",
|
||||
gui::YES_NO);
|
||||
if(res == 0) {
|
||||
write_file(argv[1],map.write());
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -89,6 +89,8 @@ void set_fullscreen(bool ison)
|
|||
if(video.modePossible(res.first,res.second,16,flags)) {
|
||||
video.setMode(res.first,res.second,16,flags);
|
||||
disp->redraw_everything();
|
||||
} else if(video.modePossible(1024,768,16,flags)) {
|
||||
set_resolution(std::pair<int,int>(1024,768));
|
||||
} else {
|
||||
gui::show_dialog(*disp,NULL,"",string_table["video_mode_fail"],
|
||||
gui::MESSAGE);
|
||||
|
@ -125,7 +127,7 @@ void set_resolution(const std::pair<int,int>& resolution)
|
|||
res.second &= ~1;
|
||||
|
||||
CVideo& video = disp->video();
|
||||
const int flags = video.isFullScreen() ? FULL_SCREEN : 0;
|
||||
const int flags = fullscreen() ? FULL_SCREEN : 0;
|
||||
if(video.modePossible(res.first,res.second,16,flags)) {
|
||||
|
||||
video.setMode(res.first,res.second,16,flags);
|
||||
|
|
|
@ -589,7 +589,7 @@ bool do_replay(display& disp, const gamemap& map, const game_data& gameinfo,
|
|||
advancing_units.push_back(tgt->first);
|
||||
}
|
||||
} else {
|
||||
std::cerr << "unrecognized action\n";
|
||||
std::cerr << "unrecognized action: '" << cfg->write() << "'\n";
|
||||
throw replay::error();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -353,8 +353,9 @@ int show_dialog(display& disp, SDL_Surface* image,
|
|||
const int image_h_padding = image != NULL ? 10 : 0;
|
||||
const int top_padding = 10;
|
||||
const int bottom_padding = 10;
|
||||
const int menu_hpadding = text_size.h > 0 && menu_.height() > 0 ? 10 : 0;
|
||||
const int padding_width = left_padding + right_padding + image_h_padding;
|
||||
const int padding_height = top_padding + bottom_padding;
|
||||
const int padding_height = top_padding + bottom_padding + menu_hpadding;
|
||||
const int caption_width = caption_size.w;
|
||||
const int image_width = image != NULL ? image->w : 0;
|
||||
const int total_image_width = caption_width > image_width ?
|
||||
|
@ -407,10 +408,10 @@ int show_dialog(display& disp, SDL_Surface* image,
|
|||
}
|
||||
}
|
||||
|
||||
const int button_hpadding = total_width - button_widths;
|
||||
const int button_wpadding = total_width - button_widths;
|
||||
int button_offset = 0;
|
||||
for(size_t button_num = 0; button_num != buttons.size(); ++button_num) {
|
||||
const int padding_amount = button_hpadding/(buttons.size()+1);
|
||||
const int padding_amount = button_wpadding/(buttons.size()+1);
|
||||
buttons[button_num].set_x(xloc + padding_amount*(button_num+1) +
|
||||
button_offset);
|
||||
buttons[button_num].set_y(yloc + total_height - button_heights);
|
||||
|
@ -425,7 +426,7 @@ int show_dialog(display& disp, SDL_Surface* image,
|
|||
|
||||
if(menu_.height() > 0)
|
||||
menu_.set_loc(xloc+total_image_width+left_padding+image_h_padding,
|
||||
yloc+top_padding+text_size.h);
|
||||
yloc+top_padding+text_size.h+menu_hpadding);
|
||||
|
||||
if(image != NULL) {
|
||||
const int x = xloc + left_padding;
|
||||
|
@ -453,7 +454,7 @@ int show_dialog(display& disp, SDL_Surface* image,
|
|||
yloc+top_padding);
|
||||
|
||||
const int image_h = image != NULL ? image->h : 0;
|
||||
const int text_widget_y = yloc+top_padding+image_h-6+text_size.h;
|
||||
const int text_widget_y = yloc+top_padding+image_h-6+text_size.h+menu_hpadding;
|
||||
|
||||
if(use_textbox) {
|
||||
text_widget.set_location(xloc + left_padding +
|
||||
|
@ -468,7 +469,7 @@ int show_dialog(display& disp, SDL_Surface* image,
|
|||
//set the position of any tick boxes. they go right below the menu, slammed against
|
||||
//the right side of the dialog
|
||||
if(options != NULL) {
|
||||
int options_y = text_widget_y + (use_textbox ? text_widget.height() : 0) + menu_.height() + button_height_padding;
|
||||
int options_y = text_widget_y + (use_textbox ? text_widget.height() : 0) + menu_.height() + button_height_padding + menu_hpadding;
|
||||
for(size_t i = 0; i != check_buttons.size(); ++i) {
|
||||
check_buttons[i].set_x(xloc + total_width - padding_width - check_buttons[i].width());
|
||||
check_buttons[i].set_y(options_y);
|
||||
|
@ -518,8 +519,8 @@ int show_dialog(display& disp, SDL_Surface* image,
|
|||
select_item = item;
|
||||
}
|
||||
|
||||
if(!key_down && key[SDLK_RETURN] &&
|
||||
(type == YES_NO || type == OK_CANCEL)) {
|
||||
if((!key_down && key[SDLK_RETURN] || menu_.double_clicked()) &&
|
||||
(type == YES_NO || type == OK_CANCEL || type == OK_ONLY)) {
|
||||
|
||||
if(text_widget_text != NULL && use_textbox)
|
||||
*text_widget_text = text_widget.text();
|
||||
|
|
83
src/unit.cpp
83
src/unit.cpp
|
@ -68,48 +68,13 @@ unit::unit(const unit_type* t, int side, bool use_traits) :
|
|||
backupAttacks_(t->attacks()),
|
||||
guardian_(false), upkeep_(UPKEEP_FULL_PRICE)
|
||||
{
|
||||
//units that don't have traits generated are just generic
|
||||
//units, so they shouldn't get a description either.
|
||||
if(use_traits) {
|
||||
//units that don't have traits generated are just generic
|
||||
//units, so they shouldn't get a description either.
|
||||
description_ = t->generate_description();
|
||||
generate_traits();
|
||||
}
|
||||
|
||||
//calculate the unit's traits
|
||||
const std::vector<config*> traits = t->possible_traits();
|
||||
|
||||
const size_t num_traits = type_->num_traits();
|
||||
if(use_traits && traits.size() >= num_traits) {
|
||||
std::set<int> chosen_traits;
|
||||
for(size_t i = 0; i != num_traits; ++i) {
|
||||
int num = get_random()%(traits.size()-i);
|
||||
while(chosen_traits.count(num)) {
|
||||
++num;
|
||||
}
|
||||
|
||||
chosen_traits.insert(num);
|
||||
|
||||
add_modification("trait",*traits[num]);
|
||||
|
||||
}
|
||||
|
||||
//build the traits description, making sure the traits are always
|
||||
//in the same order.
|
||||
for(std::set<int>::const_iterator itor = chosen_traits.begin();
|
||||
itor != chosen_traits.end(); ++itor) {
|
||||
const std::string& trait_name = (*traits[*itor])["name"];
|
||||
const std::string& lang_trait = string_table["trait_"+trait_name];
|
||||
if(lang_trait.empty() == false)
|
||||
traitsDescription_ += lang_trait;
|
||||
else
|
||||
traitsDescription_ += trait_name;
|
||||
|
||||
traitsDescription_ += ",";
|
||||
}
|
||||
|
||||
//get rid of the trailing comma
|
||||
if(!traitsDescription_.empty())
|
||||
traitsDescription_.resize(traitsDescription_.size()-1);
|
||||
}
|
||||
}
|
||||
|
||||
//constructor for advancing a unit from a lower level
|
||||
|
@ -136,6 +101,48 @@ unit::unit(const unit_type* t, const unit& u) :
|
|||
new_level();
|
||||
}
|
||||
|
||||
void unit::generate_traits()
|
||||
{
|
||||
if(!traitsDescription_.empty())
|
||||
return;
|
||||
|
||||
//calculate the unit's traits
|
||||
const std::vector<config*> traits = type().possible_traits();
|
||||
|
||||
const size_t num_traits = type().num_traits();
|
||||
if(traits.size() >= num_traits) {
|
||||
std::set<int> chosen_traits;
|
||||
for(size_t i = 0; i != num_traits; ++i) {
|
||||
int num = get_random()%(traits.size()-i);
|
||||
while(chosen_traits.count(num)) {
|
||||
++num;
|
||||
}
|
||||
|
||||
chosen_traits.insert(num);
|
||||
|
||||
add_modification("trait",*traits[num]);
|
||||
}
|
||||
|
||||
//build the traits description, making sure the traits are always
|
||||
//in the same order.
|
||||
for(std::set<int>::const_iterator itor = chosen_traits.begin();
|
||||
itor != chosen_traits.end(); ++itor) {
|
||||
const std::string& trait_name = (*traits[*itor])["name"];
|
||||
const std::string& lang_trait = string_table["trait_"+trait_name];
|
||||
if(lang_trait.empty() == false)
|
||||
traitsDescription_ += lang_trait;
|
||||
else
|
||||
traitsDescription_ += trait_name;
|
||||
|
||||
traitsDescription_ += ",";
|
||||
}
|
||||
|
||||
//get rid of the trailing comma
|
||||
if(!traitsDescription_.empty())
|
||||
traitsDescription_.resize(traitsDescription_.size()-1);
|
||||
}
|
||||
}
|
||||
|
||||
const unit_type& unit::type() const
|
||||
{
|
||||
return *type_;
|
||||
|
|
|
@ -154,6 +154,7 @@ private:
|
|||
UPKEEP_COST upkeep_;
|
||||
|
||||
void apply_modifications();
|
||||
void generate_traits();
|
||||
};
|
||||
|
||||
//object which temporarily resets a unit's movement
|
||||
|
|
|
@ -22,7 +22,8 @@ menu::menu(display& disp, const std::vector<std::string>& items,
|
|||
previous_button_(true), drawn_(false), show_result_(false),
|
||||
height_(-1), width_(-1), first_item_on_screen_(0),
|
||||
uparrow_(disp,"",gui::button::TYPE_PRESS,"uparrow"),
|
||||
downarrow_(disp,"",gui::button::TYPE_PRESS,"downarrow")
|
||||
downarrow_(disp,"",gui::button::TYPE_PRESS,"downarrow"),
|
||||
double_clicked_(false)
|
||||
{
|
||||
for(std::vector<std::string>::const_iterator item = items.begin();
|
||||
item != items.end(); ++item) {
|
||||
|
@ -182,9 +183,19 @@ void menu::handle_event(const SDL_Event& event)
|
|||
if(event.type == SDL_KEYDOWN) {
|
||||
key_press(event.key.keysym.sym);
|
||||
} else if(event.type == SDL_MOUSEBUTTONDOWN &&
|
||||
event.button.button == SDL_BUTTON_LEFT) {
|
||||
event.button.button == SDL_BUTTON_LEFT ||
|
||||
event.type == DOUBLE_CLICK_EVENT) {
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
if(event.type == SDL_MOUSEBUTTONDOWN) {
|
||||
x = event.button.x;
|
||||
y = event.button.y;
|
||||
} else {
|
||||
x = reinterpret_cast<int>(event.user.data1);
|
||||
y = reinterpret_cast<int>(event.user.data2);
|
||||
}
|
||||
|
||||
const int item = hit(event.button.x,event.button.y);
|
||||
const int item = hit(x,y);
|
||||
if(item != -1) {
|
||||
selected_ = item;
|
||||
drawn_ = false;
|
||||
|
@ -192,6 +203,10 @@ void menu::handle_event(const SDL_Event& event)
|
|||
if(click_selects_) {
|
||||
show_result_ = true;
|
||||
}
|
||||
|
||||
if(event.type == DOUBLE_CLICK_EVENT) {
|
||||
double_clicked_ = true;
|
||||
}
|
||||
}
|
||||
} else if(event.type == SDL_MOUSEMOTION && click_selects_) {
|
||||
|
||||
|
@ -250,6 +265,11 @@ int menu::process(int x, int y, bool button,bool up_arrow,bool down_arrow,
|
|||
}
|
||||
}
|
||||
|
||||
bool menu::double_clicked() const
|
||||
{
|
||||
return double_clicked_;
|
||||
}
|
||||
|
||||
const std::vector<int>& menu::column_widths() const
|
||||
{
|
||||
if(column_widths_.empty()) {
|
||||
|
|
|
@ -36,6 +36,8 @@ public:
|
|||
int process(int x, int y, bool button,bool up_arrow,bool down_arrow,
|
||||
bool page_up, bool page_down, int select_item=-1);
|
||||
|
||||
bool double_clicked() const;
|
||||
|
||||
private:
|
||||
void calculate_position();
|
||||
void key_press(SDLKey key);
|
||||
|
@ -61,6 +63,8 @@ private:
|
|||
mutable int first_item_on_screen_;
|
||||
gui::button uparrow_, downarrow_;
|
||||
|
||||
bool double_clicked_;
|
||||
|
||||
const std::vector<int>& column_widths() const;
|
||||
void draw_item(int item);
|
||||
void draw();
|
||||
|
|
Loading…
Add table
Reference in a new issue