wall of text alert...
Those icons need less work, only need to be converted to .blp, and they look cool and close to the game.
An estimation on the mapsize:
Terrain+Triggers+Unit Data+Spells < 0,5 Mb.
Sounds ~1Mb
Buffer ~0,5 Mb (you never know)
Sum = 2Mb, which leaves 2Mb open for models/textures. If the project itself is finished, we can try to get some top-notch modellers/animators/texturers to make us good models.
Those 2Mb have to be spend on:
Imp: New model, new texture (100 Kb + 100 Kb)
Fly: New model, texture is optional if no good in-game one is seen (50Kb on model)
Beetle: Can easily use crypt lord's beetles.
Spider: Can easily use warcraft spider.
Hellhound: New model (based on fellhound), no new texture (100Kb)
Troll: New model, new texture (100kb + 100 kb)
Orc: Can easily use grunt.
Skeleton: Can easily use skeleton
Ghost: I forgot how this looks like, but I guess we can use wisp.
Demon Spawn: New Model, New Texture (100kb + 100kb)
Bile Demon: New Model, New Texture (100kb + 150 kb)
Warlock: Model based on archmage?
Example. The portrait of that model probably won't be needed to import, which means this model + texture = 200kb, uncompressed.
Dark Mistress: New. - Completed. don't know size
Dragon: New Model, New Texture (100kb + 150 kb)
Vampire: New Model, in-game texture (100kb)
Horned Reaper: New Model, New Texture (100kb, 150kb)
Dirt/Gold/rock/gem: 100kb per block - custom model/texture
The sum is about 2200 Kb, uncompressed. With compression + MPQ compression (in the map), I think we certainly can bring this down to 1,5 Mb.
Some updates:
* My hand system is still considered finished.
* The digging system is still in a "concept" phase, because I don't know how I'll do gold digging. Personally I think I'm gonna go for harvest + return if the treasury is not filled, or drop if the treasury is full. I think that's also what comes closest to the actual game.
Until an early IMP script is written (I'll probably be doing this too, I guess...), I won't really be able to test the digging stuff either, but I'm quite confident that this time I'll have everything right.
* Dimensional array: I made a system so you can use 2 dimensional arrays. In them an integer (the unit-id) is stored of a block. For instance 'Gold' for a block of gold. When this value is <= 0, it means that the block has been generated on the map (or there was no block at all). Whenever a block (with coordinates x, y) dies, every block surrounding it (with coordinates from x-1, y-1 to x+1, y+1) is created if the value is not 0.
This currently doesn't really *work* because the array is initialised with 0's, and should instead be initialised with the unit id's at map generation. But I hope someone else is going to take care of the map generation system.
The system should be expanded so blocks are generated when the "far sight" ability (forgot the name of the spell) is used on a point (I can easily do this, but won't do it until we're about to implement spells).
The system should also be expanded so negative numbers (-1, -2) indicate lava / water.
Currently, all I have is the code, which I won't really be able to test until someone writes a map generation script.
How the map generation should work:
loop through every grid "point", and initialise it with a number. 0 if the room is empty, the unit id when it's not. Try to generate things in clusters, such as a cluster of connected "empty" rooms, so it actually looks like a cave, or a cluster of connected goldtiles.
The grid currently looks like this:
.....|......|.......|......|......|....
0,5 | 1,5 | 2,5 | 3,5 | 4,5 |....
0,4 | 1,4 | 2,4 | 3,4 | 4,4 |....
0,3 | 1,3 | 2,3 | 3,3 | 4,3 |....
0,2 | 1,2 | 2,2 | 3,2 | 4,2 |....
0,1 | 1,1 | 2,1 | 3,1 | 4,1 |....
0,0 | 1,0 | 2,0 | 3,0 | 4,0 |....
with BLOCKSCALE = scale of 1 (dirt, gold, ...) block = 192.0 for my units, 128.0 for redmarine's units
with maximum x = (dimension x of the map (180) * 128) / BLOCKSCALE
with maximum y = (dimension y of the map (180) * 128) / BLOCKSCALE
setting the blockvalue at position 0,0 would go like this: SetArray(0,0, value) The compiler probably won't recognise the function, so for now, put this script into your mapheader:
JASS:
function SetArray takes integer x, integer y, integer new returns nothing
endfunction
function GetArray takes integer x, integer y returns integer
return 0
endfunction
I'll merge the real function with the map generation myself.
After setting all values, there are still no walls on the map at all, thus you need to create the required walls on the indices AROUND the 0 (index ranges from x-1, y-1 to x+1, y+1), and set the corresponding values of the walls you just made to -1 (with the SetArray(x, y, -1) function).
* Something on the way I see AI handeled:
There's a list of orders:
JASS:
constant integer ORDER_NONE = 0 // Default order: imp is doing nothing of interest.
constant integer ORDER_DIG = 1 // Order: imp is digging.
constant integer ORDER_RETURN_GOLD = 2 // Order: imp is returning gold.
constant integer ORDER_CLAIM_LAND = 3 // Order: imp is claiming land.
constant integer ORDER_CLAIM_ROOM = 4 // Order: imp is claiming a room.
constant integer ORDER_ENFORCE_WALL = 5 // Order: imp is enforcing a wall.
constant integer ORDER_GATHER_CORPSE = 6 // Order: imp is returning a dead corpse to the graveyard.
constant integer ORDER_GATHER_HOSTAGE = 7 // Order: imp is returning a defeated enemy creature on your land to the prison.
constant integer ORDER_EAT = 8
constant integer ORDER_TRAIN = 9
constant integer ORDER_SLEEP = 10
constant integer ORDER_TORTURE = 11 // any comments needed?
constant integer ORDER_WORK = 12 // construct doors/traps
constant integer ORDER_READ = 13 // spell research + increased mana regeneration (DK2 mode only)
constant integer ORDER_MEDITATE = 14 // makes creature happy + increased mana regeneration (DK2 mode only)
constant integer ORDER_ATTACK = 15
Next, there's a function IssueOrder(unit, orderid) that makes the unit execute an order.
JASS:
function IssueOrder takes unit whichunit, integer orderid returns nothing
endfunction
The AI scripts will periodically loop through every unit on the map and look at its last order. If this is for example ORDER_DIG, then the next order will be ORDER_DIG or ORDER_RETURN_GOLD if the unit is full.
If there's a better alternative, please tell.
I hope everything I just told makes at least a little bit sense