Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

balliztik1

Members
  • Posts

    2052
  • Joined

  • Last visited

    Never

Everything posted by balliztik1

  1. As many know, the old spell editor was way too big. I made this new one, and want some opinions on it. http://freemmorpgmaker.com/Hosting/balliztik/spelleditor.gif This is the actual size it will appear in-game. It will have 3 tabs to conserve space, each with a basic theme about it. Tell me what you think.
  2. Knowing the damage formula in Eclipse can make you a great player. You'd have the upper hand when it comes to knowledge of how to distribute your points for maximum damage and defense for your level. That said, it could be unfair to other, less knowledgable players. This could be a slight balance issue. So, I present to you an alternative: having scripted formulae for Maximum HP, MP and SP, and damage. > The pros of the new system > You'd have more variety in Eclipse games. Diverse formulae could help balance games out in the way the user chooses. There would be no limitations, scripting-wise, to what you could do. > > The cons of the new system > As with all things script-related, one bad script spoils the bunch. If you were to install or make a faulty script, the formulae could get messed up, causing major problems in-game. > The pros of the old system > The formula never fails. Barring a total meltdown of the engine, the damage, HP, MP, and SP formulae will be as constant and straightforward as the day it was set into the source. > > The cons of the old system > With only stats to rely on, and the same formulae for all games, Eclipse-made games could get pretty repetitive. Also, those who know the formulae have the upper hand over those who don't. Both views have a good and bad side. Vote, if you'd like.
  3. I didn't like how Eclipse's word filter just changed the word to asterisks, so I changed it a bit to allow replacement words, like on the forums. (All edits are server-side.) Find _modTypes_. Paste this in there somewhere. ``` Type Wordfilterblah Word As String replacement As String End Type Public Wordfilter() As Wordfilterblah ``` Now find this: ``` Public Spritesize As Byte ``` And paste this under it: ``` Public MAX_WORDS As Integer ``` In _ModGeneral_ find these lines: ``` MAX_SCRIPTSPELLS = GetVar(App.Path & "\Data.ini", "MAX", "MAX_SCRIPTSPELLS") Paperdoll = GetVar(App.Path & "\Data.ini", "CONFIG", "PaperDoll") Spritesize = GetVar(App.Path & "\Data.ini", "CONFIG", "SpriteSize") ``` Under them, paste this: ``` MAX_WORDS = GetVar(App.Path & "\wordfilter.ini", "wordfilter", "maxwords") ``` Slightly below that, find this: ``` On Error GoTo 0 ``` Under it, add this: ``` ReDim Wordfilter(1 To MAX_WORDS) As Wordfilterblah ``` Now, in _modGameLogic_ change _Public Sub LoadWordFilter_ and _Public Function SwearCheck_ to these: ``` 'ASGARD Public Sub LoadWordFilter() Dim I If FileExist("wordfilter.ini") Then WordList = Val(GetVar(App.Path & "\wordfilter.ini", "WORDFILTER", "maxwords")) If WordList >= 1 Then For I = 1 To WordList Wordfilter(I).Word = LCase(GetVar(App.Path & "\wordfilter.ini", CStr(I), "word")) Wordfilter(I).replacement = GetVar(App.Path & "\wordfilter.ini", CStr(I), "replacement") Next I End If Else Call MsgBox("Wordfilter.INI could not be found. Please make sure it exists.") WordList = 0 End If On Error GoTo 0 Exit Sub End Sub Public Function SwearCheck(TextToSay As String) As String Dim I As Integer SwearCheck = TextToSay If WordList
  4. I was feeling the need for a new avatar, so I drew one up in paint. I didn't like the colors, so I threw on some effects in Photoshop and it turned out halfway decent, in my opinion. Ratings or comments would be appreciated.
  5. I was wondering if anyone else has the new Guitar Hero game? If so, what do you think of it? Personally, I don't think it was worth $40\. It's just a remake of GH2\. There's nothing new about it except the outfits, color scheme, and songs. I do like the choice of songs, though. I beat it on expert last night. :grin: The last song was pretty hard to beat, but I finally got it on the third try.
  6. With EE, pushing cast in the spellbook no longer casts the spell that is selected. Instead, it casts the memorized spell. Here's how to change it back to TE's way of casting. Find this line in the client, in procedure _lblCast_Click_: ``` Call SendData("cast" & SEP_CHAR & SpellMemorized & SEP_CHAR & END_CHAR) ``` Replace it with this line: ``` Call SendData("cast" & SEP_CHAR & lstSpells.ListIndex + 1 & SEP_CHAR & END_CHAR) ``` Now casting will work like it did in TE.
  7. Well, there's some things in the Eclipse source that I feel could be altered so that it does the same thing, without requiring as much code. I will add any changes that I find to this list. **Function CanMove** It was bad. This function had 26 (!) checks for which direction that the player is facing and 4 completely different sets of code for each button that could be pushed (up, down, left or right). I completely got rid of the direction checks and had it run the same code, no matter which button is pushed. Client side, find _Function CanMove() As Boolean_ and change the entire function to this: ``` Function CanMove() As Boolean Dim i As Long Dim x As Long Dim y As Long CanMove = True If Player(MyIndex).Moving 0 Then CanMove = False Exit Function End If ' Make sure they haven't just casted a spell If Player(MyIndex).CastedSpell = YES Then If GetTickCount > Player(MyIndex).AttackTimer + 1000 Then Player(MyIndex).CastedSpell = NO Else CanMove = False Exit Function End If End If x = GetPlayerX(MyIndex) y = GetPlayerY(MyIndex) If DirUp Then Call SetPlayerDir(MyIndex, DIR_UP) y = y - 1 ElseIf DirDown Then Call SetPlayerDir(MyIndex, DIR_DOWN) y = y + 1 ElseIf DirLeft Then Call SetPlayerDir(MyIndex, DIR_LEFT) x = x - 1 Else Call SetPlayerDir(MyIndex, DIR_RIGHT) x = x + 1 End If Call SendPlayerDir If y < 0 Then If Map(GetPlayerMap(MyIndex)).Up > 0 Then Call SendPlayerRequestNewMap(0) GettingMap = True End If CanMove = False Exit Function ElseIf y > MAX_MAPY Then If Map(GetPlayerMap(MyIndex)).Down > 0 Then Call SendPlayerRequestNewMap(0) GettingMap = True End If CanMove = False Exit Function ElseIf x < 0 Then If Map(GetPlayerMap(MyIndex)).Left > 0 Then Call SendPlayerRequestNewMap(0) GettingMap = True End If CanMove = False Exit Function ElseIf x > MAX_MAPX Then If Map(GetPlayerMap(MyIndex)).Right > 0 Then Call SendPlayerRequestNewMap(0) GettingMap = True End If CanMove = False Exit Function End If If Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_BLOCKED Or Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_SIGN Or Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_ROOFBLOCK Or Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_SKILL Then CanMove = False Exit Function End If If Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_CBLOCK Then If Map(GetPlayerMap(MyIndex)).Tile(x, y).Data1 = Player(MyIndex).Class Then Exit Function If Map(GetPlayerMap(MyIndex)).Tile(x, y).Data2 = Player(MyIndex).Class Then Exit Function If Map(GetPlayerMap(MyIndex)).Tile(x, y).Data3 = Player(MyIndex).Class Then Exit Function CanMove = False End If If Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_GUILDBLOCK And Map(GetPlayerMap(MyIndex)).Tile(x, y).String1 GetPlayerGuild(MyIndex) Then CanMove = False End If If Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_KEY Or Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_DOOR Then If TempTile(x, y).DoorOpen = NO Then CanMove = False Exit Function End If End If If Map(GetPlayerMap(MyIndex)).Tile(x, y).Type = TILE_TYPE_WALKTHRU Then Exit Function Else For i = 1 To MAX_PLAYERS If IsPlaying(i) And GetPlayerMap(i) = GetPlayerMap(MyIndex) Then If (GetPlayerX(i) = x) And (GetPlayerY(i) = y) Then CanMove = False Exit Function End If End If Next i End If For i = 1 To MAX_MAP_NPCS If MapNpc(i).num > 0 Then If (MapNpc(i).x = x) And (MapNpc(i).y = y) Then CanMove = False Exit Function End If End If Next i If CanAttributeNPCMove(DIR_UP) = False Then CanMove = False Exit Function End If End Function ``` > Was: 554 lines of code > Changed to: 124 lines of code > Percent Change: ~77.6% reduction **Sub SetSpeed** A simple edit. The original sub was doing exponents backwards by means of division with remainders (eeew) and do/loop, when using a logarithmic function can cut it down to a single if-statement. Server side, find _Sub SetSpeed_ and find this chunk of code in it: ``` div = 2 Do While div 0 Then ' Check to make sure that the tile is walkable If Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type TILE_TYPE_BLOCKED And Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type TILE_TYPE_ROOFBLOCK Then If Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type = TILE_TYPE_GUILDBLOCK And Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).String1 GetPlayerGuild(index) Then Exit Sub End If 'Check to see if the tile is a skill tile If Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type TILE_TYPE_SKILL Then ' Check to see if the tile is a key and if it is check if its opened If (Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type TILE_TYPE_KEY Or Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type TILE_TYPE_DOOR) Or ((Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type = TILE_TYPE_DOOR Or Map(GetPlayerMap(index)).tile(GetPlayerX(index) - 1, GetPlayerY(index)).Type = TILE_TYPE_KEY) And TempTile(GetPlayerMap(index)).DoorOpen(GetPlayerX(index) - 1, GetPlayerY(index)) = YES) Then 'BARON DEBUG TIME - CAUSE OF RTE 9'S ABOVE ? Call SetPlayerX(index, GetPlayerX(index) - 1) packet = PacketID.PlayerMove & SEP_CHAR & index & SEP_CHAR & GetPlayerX(index) & SEP_CHAR & GetPlayerY(index) & SEP_CHAR & GetPlayerDir(index) & SEP_CHAR & Movement & SEP_CHAR & END_CHAR Call SendDataToMapBut(index, GetPlayerMap(index), packet) Moved = YES End If End If End If Else ' Check to see if we can move them to the another map If Map(GetPlayerMap(index)).left > 0 Then Call PlayerWarp(index, Map(GetPlayerMap(index)).left, MAX_MAPX, GetPlayerY(index)) Moved = YES End If End If Case DIR_RIGHT ' Check to make sure not outside of boundries If GetPlayerX(index) < MAX_MAPX Then ' Check to make sure that the tile is walkable If Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type TILE_TYPE_BLOCKED And Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type TILE_TYPE_ROOFBLOCK Then If Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type = TILE_TYPE_GUILDBLOCK And Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).String1 GetPlayerGuild(index) Then Exit Sub End If ' Check for skill tile If Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type TILE_TYPE_SKILL Then ' Check to see if the tile is a key and if it is check if its opened If (Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type TILE_TYPE_KEY Or Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type TILE_TYPE_DOOR) Or ((Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type = TILE_TYPE_DOOR Or Map(GetPlayerMap(index)).tile(GetPlayerX(index) + 1, GetPlayerY(index)).Type = TILE_TYPE_KEY) And TempTile(GetPlayerMap(index)).DoorOpen(GetPlayerX(index) + 1, GetPlayerY(index)) = YES) Then Call SetPlayerX(index, GetPlayerX(index) + 1) packet = PacketID.PlayerMove & SEP_CHAR & index & SEP_CHAR & GetPlayerX(index) & SEP_CHAR & GetPlayerY(index) & SEP_CHAR & GetPlayerDir(index) & SEP_CHAR & Movement & SEP_CHAR & END_CHAR Call SendDataToMapBut(index, GetPlayerMap(index), packet) Moved = YES End If End If End If Else ' Check to see if we can move them to the another map If Map(GetPlayerMap(index)).Right > 0 Then Call PlayerWarp(index, Map(GetPlayerMap(index)).Right, 0, GetPlayerY(index)) Moved = YES End If End If End Select ``` Change that to this: ``` x = GetPlayerX(index) y = GetPlayerY(index) Select Case GetPlayerDir(index) Case 0 y = y - 1 Case 1 y = y + 1 Case 2 x = x - 1 Case 3 x = x + 1 End Select 'Check for edge of map If y < 0 Then If Map(GetPlayerMap(index)).Up > 0 Then Call PlayerWarp(index, Map(GetPlayerMap(index)).Up, GetPlayerX(index), MAX_MAPY) Moved = YES End If ElseIf y > MAX_MAPY Then If Map(GetPlayerMap(index)).Down > 0 Then Call PlayerWarp(index, Map(GetPlayerMap(index)).Down, GetPlayerX(index), 0) Moved = YES End If ElseIf x < 0 Then If Map(GetPlayerMap(index)).Left > 0 Then Call PlayerWarp(index, Map(GetPlayerMap(index)).Left, MAX_MAPX, GetPlayerY(index)) Moved = YES End If ElseIf x > MAX_MAPX Then If Map(GetPlayerMap(index)).Right > 0 Then Call PlayerWarp(index, Map(GetPlayerMap(index)).Right, 0, GetPlayerY(index)) Moved = YES End If End If ' Check to make sure that the tile is walkable If Map(GetPlayerMap(index)).tile(x, y).Type TILE_TYPE_BLOCKED And Map(GetPlayerMap(index)).tile(x, y).Type TILE_TYPE_ROOFBLOCK Then If Map(GetPlayerMap(index)).tile(x, y).Type = TILE_TYPE_GUILDBLOCK And Trim(Map(GetPlayerMap(index)).tile(x, y).String1) Trim(GetPlayerGuild(index)) Then Exit Sub End If ' Check to see if the tile is a skill tile If Map(GetPlayerMap(index)).tile(x, y).Type TILE_TYPE_SKILL Then ' Check to see if the tile is a key and if it is check if its opened If (Map(GetPlayerMap(index)).tile(x, y).Type TILE_TYPE_KEY Or Map(GetPlayerMap(index)).tile(x, y).Type TILE_TYPE_DOOR) Or ((Map(GetPlayerMap(index)).tile(x, y).Type = TILE_TYPE_DOOR Or Map(GetPlayerMap(index)).tile(x, y).Type = TILE_TYPE_KEY) And TempTile(GetPlayerMap(index)).DoorOpen(x, y) = YES) Then Call SetPlayerY(index, y) Call SetPlayerX(index, x) packet = "playermove" & SEP_CHAR & index & SEP_CHAR & GetPlayerX(index) & SEP_CHAR & GetPlayerY(index) & SEP_CHAR & GetPlayerDir(index) & SEP_CHAR & Movement & SEP_CHAR & END_CHAR Call SendDataToMapBut(index, GetPlayerMap(index), packet) Moved = YES End If End If ``` > Was: 572 lines of code > Changed to: 481 lines of code > Percent Change: ~15.9% reduction
  8. Here's a copy of all the subs and functions I have added to clsCommands, so I could use them in my main.txt. Feel free to use whichever of these you want. I'm not going to write how to use each one, because the names should tell what the command does. Feel free to ask about individual ones if you do not understand. ``` Sub SetMapNPC(MapNum, slot, NpcNum) If MapNum < 1 Or MapNum > MAX_MAPS Or slot < 0 Or slot > 14 Or NpcNum < 0 Or NpcNum > MAX_NPCS Then Exit Sub End If map(MapNum).Npc(slot) = NpcNum End Sub Function NumberPlayersOnMap(map) Dim variable NumberPlayersOnMap = 0 variable = 1 Do While variable MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCHP = MapNpc(map, slot).HP End Function Function GetMapNPCMaxHP(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCMaxHP = Npc(MapNpc(map, slot).num).MaxHP End Function Function GetNPCMaxHP(index) If index MAX_NPCS Then GetNPCMaxHP = 0 Exit Function End If GetNPCMaxHP = Npc(index).MaxHP End Function Function GetNPCX(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetNPCX = MapNpc(map, slot).x End Function Function GetNPCY(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetNPCY = MapNpc(map, slot).y End Function Function GetNPCStrength(index) If index MAX_NPCS Then GetNPCStrength = 0 Exit Function End If GetNPCStrength = Npc(index).STR End Function Function GetNPCDefense(index) If index MAX_NPCS Then GetNPCDefense = 0 Exit Function End If GetNPCDefense = Npc(index).DEF End Function Function GetNPCSprite(index) If index MAX_NPCS Then GetNPCSprite = 0 Exit Function End If GetNPCSprite = Npc(index).sprite End Function Function GetNPCSpeak(index) If index MAX_NPCS Then GetNPCSpeak = 0 Exit Function End If GetNPCSpeak = Npc(index).AttackSay End Function Function GetNPCName(index) If index MAX_NPCS Then GetNPCName = 0 Exit Function End If GetNPCName = Trim(Npc(index).Name) End Function Function GetNPCElement(index) If index MAX_NPCS Then GetNPCElement = 0 Exit Function End If GetNPCElement = Npc(index).Element End Function Function GetMapNPCStrength(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCStrength = Npc(MapNpc(map, slot).num).STR End Function Function GetMapNPCDefense(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCDefense = Npc(MapNpc(map, slot).num).DEF End Function Function GetMapNPCSprite(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCSprite = Npc(MapNpc(map, slot).num).sprite End Function Function GetMapNPCSpeak(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCSpeak = Npc(MapNpc(map, slot).num).AttackSay End Function Function GetMapNPCName(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCName = Trim(Npc(MapNpc(map, slot).num).Name) End Function Function GetMapNPCElement(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetMapNPCElement = Npc(MapNpc(map, slot).num).Element End Function Function GetNPCDir(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetNPCDir = MapNpc(map, slot).Dir End Function Function GetEquippedWeapon(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If If GetPlayerRingSlot(index) 0 Then GetEquippedWeapon = GetPlayerInvItemNum(index, GetPlayerWeaponSlot(index)) Else GetEquippedWeapon = 0 End If End Function Function GetEquippedLegs(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If If GetPlayerLegsSlot(index) 0 Then GetEquippedLegs = GetPlayerInvItemNum(index, GetPlayerLegsSlot(index)) Else GetEquippedLegs = 0 End If End Function Function GetEquippedShield(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If If GetPlayerShieldSlot(index) 0 Then GetEquippedShield = GetPlayerInvItemNum(index, GetPlayerShieldSlot(index)) Else GetEquippedShield = 0 End If End Function Function GetEquippedArmor(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If If GetPlayerArmorSlot(index) 0 Then GetEquippedArmor = GetPlayerInvItemNum(index, GetPlayerArmorSlot(index)) Else GetEquippedArmor = 0 End If End Function Function GetEquippedRing(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If If GetPlayerRingSlot(index) 0 Then GetEquippedRing = GetPlayerInvItemNum(index, GetPlayerRingSlot(index)) Else GetEquippedRing = 0 End If End Function Function GetEquippedNecklace(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If GetEquippedNecklace = GetPlayerInvItemNum(index, GetPlayerNecklaceSlot(index)) End Function Sub SetNPCHP(map, slot, hitpoints) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Or hitpoints < 0 Or hitpoints > Npc(MapNpc(map, slot).num).MaxHP Then Exit Sub End If MapNpc(map, slot).HP = hitpoints End Sub Sub SetNPCDir(map, slot, direction) If direction < 0 Or direction > 3 Or map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Sub End If MapNpc(map, slot).Dir = direction End Sub Sub SetNPCX(map, slot, xcoord) If xcoord MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Sub End If MapNpc(map, slot).x = xcoord End Sub Sub SetNPCY(map, slot, ycoord) If ycoord MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Sub End If MapNpc(map, slot).y = ycoord End Sub Function CheckforItem(index, itemnum, value) Dim x CheckforItem = "False" x = 1 Do While x = value Then CheckforItem = "True" Exit Function End If End If x = x + 1 Loop End Function Function GetPlayerNecklaceSlot(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then GetPlayerNecklaceSlot = 0 Exit Function End If GetPlayerNecklaceSlot = Player(index).Char(Player(index).CharNum).NecklaceSlot End Function Function GetPlayerRingSlot(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then GetPlayerRingSlot = 0 Exit Function End If GetPlayerRingSlot = Player(index).Char(Player(index).CharNum).RingSlot End Function Function CheckTakeItem(index, itemnum, value) As Boolean Dim x CheckTakeItem = False x = 1 Do While x = value Then CheckTakeItem = True GoTo TheCandyStore End If End If x = x + 1 Loop Exit Function TheCandyStore: Call SetPlayerInvItemValue(index, x, GetPlayerInvItemValue(index, x) - value) If GetPlayerInvItemValue(index, x) = 0 Then Call SetPlayerInvItemNum(index, x, 0) Call SetPlayerInvItemDur(index, x, 0) End If Call SendInventory(index) End Function Function GetPlayerSex(index) If index MAX_PLAYERS Or Not IsPlaying(index) Then Exit Function End If GetPlayerSex = Player(index).Char(Player(index).CharNum).Sex End Function Function GetNPCTarget(map, slot) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Then Exit Function End If GetNPCTarget = MapNpc(map, slot).Target End Function Sub SetNPCTarget(map, slot, targetindex) If map < 1 Or map > MAX_MAPS Or slot < 0 Or slot > 14 Or targetindex < 0 Or targetindex > MAX_PLAYERS Or IsPlaying(targetindex) = False Or GetPlayerMap(targetindex) map Then Exit Sub End If MapNpc(map, slot).Target = targetindex End Sub Function GetItemDamage(itemnum) GetItemDamage = item(itemnum).Data2 End Function Function GetItemName(itemnum) GetItemName = Trim(item(itemnum).Name) End Function Function GetItemStrBonus(itemnum) GetItemStrBonus = item(itemnum).AddStr End Function Function GetItemDefenseBonus(itemnum) GetItemDefenseBonus = item(itemnum).AddDef End Function Function GetItemHPBonus(itemnum) GetItemHPBonus = item(itemnum).AddHP End Function Function GetItemMagicBonus(itemnum) GetItemMagicBonus = item(itemnum).AddMagi End Function Function GetItemMPBonus(itemnum) GetItemMPBonus = item(itemnum).AddMP End Function Function GetItemSpeedBonus(itemnum) GetItemSpeedBonus = item(itemnum).AddSpeed End Function Function GetItemSPBonus(itemnum) GetItemSPBonus = item(itemnum).AddSP End Function Function GetIsItemBound(itemnum) GetIsItemBound = item(itemnum).Bound End Function Function GetItemClassReq(itemnum) GetItemClassReq = item(itemnum).ClassReq End Function Function GetItemDefenseReq(itemnum) GetItemDefenseReq = item(itemnum).DefReq End Function Function GetItemSTRReq(itemnum) GetItemSTRReq = item(itemnum).StrReq End Function Function GetItemSpeedReq(itemnum) GetItemSpeedReq = item(itemnum).SpeedReq End Function Function GetItemAccessReq(itemnum) GetItemAccessReq = item(itemnum).AccessReq End Function Function GetItemAttackSpeed(itemnum) GetItemAttackSpeed = item(itemnum).AttackSpeed End Function Function GetIsItemStackable(itemnum) GetIsItemStackable = item(itemnum).Stackable End Function Function GetItemPrice(itemnum) GetItemPrice = item(itemnum).Price End Function Function GetItemDescription(itemnum) GetItemDescription = item(itemnum).Desc End Function Function GetItemType(itemnum) GetItemType = item(itemnum).Type End Function Sub GetDayOrNight() If GameTime = TIME_NIGHT Then GetDayOrNight = 1 Else GetDayOrNight = 0 End If End Sub Function GetTimeHours() GetTimeHours = Hours End Function Function GetTimeMinutes() Dim Minutes Minutes = Split(frmServer.Label8.Caption, ":") GetTimeMinutes = Minutes(1) End Function Function GetTimeSeconds() Dim Seconds Seconds = Split(frmServer.Label8.Caption, ":") GetTimeSeconds = Mid(Seconds(2), 1, 2) End Function Function GetTime() GetTime = GetTimeHours & ":" & GetTimeMinutes & ":" & GetTimeSeconds End Function Sub Equip(index, itemnum, slot) Dim x If itemnum > 0 Then x = 1 Do While x 0 Then x = 1 Do While x
  9. In Eclipse, there are several triggers you can use for scripts: tiles, timers, scripted NPCs, etc. Adding more triggers to the main.txt can be a great way to expand the possibilities of Eclipse. With just the addition of a few lines of code in the source, you can add hundreds of new scripting possibilities. (All additions are in the server-side source code.) **Sub OnNpcHitPlayer** In _modGameLogic_, find procedure _NPCAttackPlayer_. In it, look for this line: ``` Name = Trim(Npc(MapNpc(MapNum, MapNpcNum).num).Name) ``` Right underneath that, paste this: ``` MyScript.ExecuteStatement "Scripts\main.txt", "OnNpcHitPlayer " & Victim & "," & MapNpcNum & "," & Damage ``` Now, add this sub to your main.txt: ``` Sub OnNPCHitPlayer(index, mapnpcnum, damage) Call BattleMsg(index, "You were hit by a " & GetMapNPCName(GetPlayerMap(index), mapnpcnum) & " for " & damage & " damage.", 4, 0) End Sub ``` Now, whenever an NPC hits a player, a script can be called. **Sub OnPlayerHitNPC** In _modGameLogic_, find procedure _AttackNpc_. In it, look for these lines: ``` MapNum = GetPlayerMap(Attacker) NpcNum = MapNpc(MapNum, MapNpcNum).num Name = Trim(Npc(NpcNum).Name) ``` Right underneath that, paste this: ``` MyScript.ExecuteStatement "Scripts\main.txt", "OnPlayerHitNPC " & Attacker & "," & MapNpcNum & "," & Damage ``` Now, add this sub to your main.txt: ``` Sub OnPlayerHitNPC(index, mapnpcnum, damage) Call BattleMsg(index, "You hit a " & GetMapNPCName(GetPlayerMap(index), mapnpcnum) & " for " & damage & " damage.", 4, 0) End Sub ``` Now, whenever a player hits an NPC, a script can be called. **Sub OnNpcDeath** (Already in EE) In _modGameLogic_, find procedure _AttackNpc_. In it, look for this line: ``` If Damage >= MapNpc(MapNum, MapNpcNum).HP Then ``` Right underneath that, paste this: ``` MyScript.ExecuteStatement "Scripts\main.txt", "OnNPCDeath " & Attacker & "," & MapNpcNum ``` Now, add this sub to your main.txt: ``` Sub OnNpcDeath(index, mapnpcnum) Call BattleMsg(index, "You killed a " & GetMapNPCName(GetPlayerMap(index), mapnpcnum) & ".", 4, 0) End Sub ``` Now, whenever a player kills an NPC, a script can be called. **Sub OnPlayerHitPlayer** In _modGameLogic_, find procedure _AttackPlayer_. In it, look for this line: ``` Call SendDataToMapBut(Attacker, GetPlayerMap(Attacker), "ATTACK" & SEP_CHAR & Attacker & SEP_CHAR & END_CHAR) ``` Right underneath that, paste this: ``` MyScript.ExecuteStatement "Scripts\Main.txt", "OnPlayerHitPlayer " & Attacker & "," & Victim & "," & Damage ``` Now, add this sub to your main.txt: ``` Sub OnPlayerHitPlayer(attacker, victim, damage) Call BattleMsg(attacker, "You hit " & GetPlayerName(victim) & " for " & damage & " damage.", 4, 0) Call BattleMsg(victim, GetPlayerName(attacker) & " hit you for " & damage & " damage.", 4, 0) End Sub ``` Now, whenever a player hits another player, a script can be called. _**Sub OnPlayerPKPlayer**_ (Already in EE) In _modGameLogic_, find procedure _AttackPlayer_. In it, look for this line: ``` If Damage >= GetPlayerHP(Victim) Then ``` Right underneath that, paste this: ``` MyScript.ExecuteStatement "Scripts\Main.txt", "OnPlayerPKPlayer " & Attacker & "," & Victim ``` Now, add this sub to your main.txt: ``` Sub OnPlayerPKPlayer(attacker, victim) Call BattleMsg(attacker, "You killed " & GetPlayerName(victim) & ".", 4, 0) Call BattleMsg(victim, GetPlayerName(attacker) & " killed you.", 4, 0) End Sub ``` Now, whenever a player kills another player (outside of an arena), a script can be called. **Sub OnPlayerPKPlayerArena** (Already in EE) In _modGameLogic_, find procedure _AttackPlayer_. In it, look for these lines: ``` ElseIf map(GetPlayerMap(Attacker)).Tile(GetPlayerX(Attacker), GetPlayerY(Attacker)).Type = TILE_TYPE_ARENA And map(GetPlayerMap(Victim)).Tile(GetPlayerX(Victim), GetPlayerY(Victim)).Type = TILE_TYPE_ARENA Then If Damage >= GetPlayerHP(Victim) Then ``` Right underneath that, paste this: ``` MyScript.ExecuteStatement "Scripts\Main.txt", "OnPlayerPKPlayerArena " & Attacker & "," & Victim ``` Now, add this sub to your main.txt: ``` Sub OnPlayerPKPlayerArena(attacker, victim) Call BattleMsg(attacker, "You killed " & GetPlayerName(victim) & ".", 4, 0) Call BattleMsg(victim, GetPlayerName(attacker) & " killed you.", 4, 0) End Sub ``` Now, whenever a player kills another player on an arene tile, a script can be called. **Sub OnEquip** and **Sub OnUnEquip** In _modServerTCP_, find procedure _HandleData_. In it, look for this line: ``` ' Find out what kind of item it is ``` Underneath that, find these lines: ``` Call SetPlayerArmorSlot(index, InvNum) Else Call SetPlayerArmorSlot(index, 0) End If ``` Change those to these: ``` MyScript.ExecuteStatement "Scripts\Main.txt", "OnEquip " & index & "," & GetPlayerInvItemNum(index, InvNum) & "," & InvNum Else MyScript.ExecuteStatement "Scripts\Main.txt", "OnUnEquip " & index & "," & GetPlayerInvItemNum(index, InvNum) & "," & InvNum End If ``` There are six instances where you have to change them. There's one each for weapons, helmets, armor, shields, rings, and necklaces. In the main.txt, add these subs: ``` Sub OnEquip(index, itemnum, slot) Select Case itemnum Case 0 Call PlayerMsg(index, "Houston, we have a problem.", 15) Case Else Call PlayerMsg(index, "You just equipped a " & GetItemName(itemnum) & " from item slot " & slot, 15) Call Equip(index, 0, slot) End Select End Sub Sub OnUnequip(index, itemnum, slot) Select Case itemnum Case 0 Call PlayerMsg(index, "Houston, we have a problem.", 15) Case Else Call PlayerMsg(index, "You just unequipped a " & GetItemName(itemnum) & " out of item slot " & slot, 15) Call Unequip(index, 0, slot) End Select End Sub ``` There you have it. New script triggers. Keep in mind, that to function properly, some of these additions need commands from my clsCommands, found [here](http://www.freemmorpgmaker.com/smf/index.php/topic,16163.0.html).
  10. Whose idea was it to name one of the chat log files main.txt? I did a search for main.txt so I could put all my scripts together and it came back with 1700 files!
  11. balliztik1

    Multiple?

    What exactly does the _Multiple_ variable in the config.ini do, and does anyone use it? The reason I ask is because fixing scrolling maps may require switching back to TE's _BltTile_ sub, which doesn't include anything about _Multiple_. If it's a useful feature, I'll try to find a way of fixing scrolling maps without the revert. If not, I'll send Spodi the fix.
  12. Once again, I stumble across something that I wasn't looking for. Here's the sub in question. ``` Sub SendIndexWornEquipmentFromMap(ByVal index As Long) Dim packet As String Dim I As Long Dim Armor As Long Dim Helmet As Long Dim Shield As Long Dim Weapon As Long Dim Legs As Long Dim Ring As Long Dim Necklace As Long For I = 1 To MAX_PLAYERS If IsPlaying(I) = True Then If GetPlayerMap(index) = GetPlayerMap(I) Then Armor = 0 Helmet = 0 Shield = 0 Weapon = 0 Legs = 0 Ring = 0 Necklace = 0 If GetPlayerArmorSlot(I) > 0 Then Armor = GetPlayerInvItemNum(I, GetPlayerArmorSlot(I)) If GetPlayerHelmetSlot(I) > 0 Then Helmet = GetPlayerInvItemNum(I, GetPlayerHelmetSlot(I)) If GetPlayerShieldSlot(I) > 0 Then Shield = GetPlayerInvItemNum(I, GetPlayerShieldSlot(I)) If GetPlayerWeaponSlot(I) > 0 Then Weapon = GetPlayerInvItemNum(I, GetPlayerWeaponSlot(I)) If GetPlayerLegsSlot(I) > 0 Then Legs = GetPlayerInvItemNum(I, GetPlayerLegsSlot(I)) If GetPlayerRingSlot(I) > 0 Then Ring = GetPlayerInvItemNum(I, GetPlayerRingSlot(I)) If GetPlayerNecklaceSlot(I) > 0 Then Necklace = GetPlayerInvItemNum(I, GetPlayerNecklaceSlot(I)) packet = "itemworn" & SEP_CHAR & index & SEP_CHAR & Armor & SEP_CHAR & Weapon & SEP_CHAR & Helmet & SEP_CHAR & Shield & SEP_CHAR & Legs & SEP_CHAR & Ring & SEP_CHAR & Necklace & SEP_CHAR & END_CHAR Call SendDataTo(index, packet) End If End If Next I End Sub ``` It's sending a packet to player _index_ with player _I_'s paperdoll. This: > packet = "itemworn" & SEP_CHAR & **index** & SEP_CHAR & Armor & SEP_CHAR & Weapon & SEP_CHAR & Helmet & SEP_CHAR & Shield & SEP_CHAR & Legs & SEP_CHAR & Ring & SEP_CHAR & Necklace & SEP_CHAR & END_CHAR Should be: > packet = "itemworn" & SEP_CHAR & **I** & SEP_CHAR & Armor & SEP_CHAR & Weapon & SEP_CHAR & Helmet & SEP_CHAR & Shield & SEP_CHAR & Legs & SEP_CHAR & Ring & SEP_CHAR & Necklace & SEP_CHAR & END_CHAR Right?
  13. TILE_TYPE_CHEST is defined in the server and client, but I don't see anything about what it does, or any code at all containing it. It's also absent from the map editor. I'm assuming it was an old feature that was taken out or something. Can someone elaborate?
  14. Does anyone here read Order of the Stick or ErfWorld? I thought I saw saw someone post that they liked OotS a while back. http://www.giantitp.com/Comics.html
  15. What happened to the source forums? Almost all of the threads that were there are gone.
  16. I've decided to compile a list of names of items, places, etc. that you can use for a medieval setting. You can use these to take the bland "short swords" from your game, and replace them with more exotic sounding names. **ARMOR** Body Armor * Breastplate (plate) * Hauberk (mail) * Cuirass (plate) * Corselet (plate) * Jazerant (plate) * Segmentata (plate) * Jerkin (leather) * Brigandine (plate) Helmets * Coif (leather or mail) * Cabasset (open helmet) * Morion (open helmet) * Sallet (full helmet w/visor) * Barbut (full helmet) * Basinet (full helmet w/visor) * Armet (full helmet w/visor) * Burgonet (open helmet w/cheek guards) * Cervelière (full helmet) * Spangenhelm (open helmet w/cheek guards) Leg Armor * Cuisse (thigh guard) * Poleyn (knee guard) * Greave (shin guard) * Sabaton (foot guard) * Jambeau (shin guard) * Chausses (mail leggings) * Schynbald (shin guard) * Solleret (foot guard) Arm/Shoulder Armor * Pauldron (shoulder guard) * Spaulder (shoulder guard) * Haute-Piece (elevated shoulder guard) * Vambrace (arm guard) * Couter (elbow guard) * Gauntlet (hand guard) Other Armor * Fauld (waist; mail under-armor) * Tasset (hip; plate) * Gorget (neck; metal) * Beaver (throat/face; metal) Shields * Buckler (circle; small; metal) * Targe or Target (circle) * Pelta (oval) * Heater Shield (triangle) * Kite Shield (triangle) * Tower Shield (any shape; very tall) * Pavise (huge & bulky; full body protection) Also of note, I found, is the word Lamé, meaning a band or strip. The adjective form of this is lamellar. It's possible to have a lamellar form of almost any armor above. Also, armor can be "fluted", or decorated with grooves. –---------------------------------------------------------------- **Weapons** Polearms * Glaive (knife blade) * Guisarme (hook) * Voulge ("cleaver" blade) * Partisan (spear & two side blades) * Fauchard (sickle) * Corcesca (sword blade & two hooks) * Halberd (axe blade, spear tip & hook) * Ranseur (spear w/hilt) * Bill (combination of any two others) * Spetum (spear & two spikes) * Bardiche (BIG axe blade) Daggers * Kris (waveblade; double-edged) * Dirk (double-edged) * Sai (has a hilt; piercing) * Poignard (single-edged) * Stiletto (single-edged) * Kukri or Khukuri (curved; single-edged) * Shiv (piercing) * Scramasax (single-edged) Swords * Shotel (Curved blade; short) * Scimitar (Curved blade; medium) * Falchion (Single edge; short) * Cutlass (Curved blade; medium) * Sabre (Thin, curved blade; medium) * Claymore (Two handed sword) * Flamberge (Wave-blade; long) NOT AN ACTUAL WORD (Flammard or Flambard is proper, though Flamberge is popularly accepted) * Schiavona (Wide, basket-hilted sword) * Cinquedea (Short, wide blade) * Zweihänder (Two handed sword) * Falcata (Inverse-curved sword; short) * Falx (Inverse-curved sword; short) * Kopis (Slightly inversely-curved sword; short) * Spatha (Short, wide blade) * Rapier (Long, thin, parrying blade) * Firangi (Long, straight blade) * Kora (Heavily curved sword; medium) * Khopesh (Heavily curved sword; short) * Shamshir (Curved blade; medium) Bows **With bows, the standard types are longbows and shortbows, but can be modified. So, you might see a reflex longbow, or a composite recurved shortbow.** * Longbow (long range) * Shortbow (short range) * Composite Bow (multiple layers; more durable) * Recurved (curve-away tips; more power; less durable) * Reflex (curve-away arms; more power; less durable) * Decurved (curve-toward tips; less power; more durable) * Deflex (curve-toward arms; less power; more durable) Crossbow * Arbalest (big crossbow) * Ballista (spring-loaded bolt launcher) TECHNICALLY NOT A CROSSBOW * Gastraphetes (handheld crossbow) * Cranequin (cranked crossbow) * Windlass (big, cranked crossbow) * Oxybeles (large artillery crossbow) –---------------------------------------------------------------- **If you have a name to add to the list, or want to help out with this, post or PM me.**
  17. http://www.freemmorpgmaker.com/Hosting/balliztik/AcousticGuitarInAMinor.mp3 Just a little something I wrote today. What do you think of it?
  18. I wanted to make something on the server that would allow me to see what timers were running, and allow me to remove and add them from outside the client, so I made a ListBox within the server that allows me to do that. Here's how I have it set up. ![](http://www.freemmorpgmaker.com/Hosting/balliztik/frmserver.GIF) I added a new tab to the server. Change the _Tabs_ and _TabsPerRow_ properties of _frmServer_ to 5 each, and you can change the caption of the new tab to suit you (I used "Timers"). Now, on this new tab, add the _ListBox_, two _TextBox_es, and the _Command Button_ shown above, making sure you use the names provided. View the code of _frmServer_ and add these subs in. ``` Private Sub cmdTimerAdd_Click() Call AddNewTimer(txtTmrName.text, Int(txtTmrInt.text)) End Sub Private Sub lstTimers_DblClick() Call GetRidOfTimer(lstTimers.List(lstTimers.ListIndex)) lstTimers.RemoveItem lstTimers.ListIndex End Sub Private Sub txtTmrInt_Click() If txtTmrInt.text = "Interval" Then txtTmrInt.text = "" End If End Sub Private Sub txtTmrName_Click() If txtTmrName.text = "Timer Name" Then txtTmrName.text = "" End If End Sub ``` Finally, open up _modGameLogic_ and find the subs _AddNewTimer_ and _GetRidOfTimer_. Replace them with these modified subs. ``` Sub AddNewTimer(ByVal Name As String, ByVal Interval As Long) On Error Resume Next Dim TmpTimer As clsCTimers Set TmpTimer = New clsCTimers TmpTimer.Name = Name TmpTimer.Interval = Interval TmpTimer.tmrWait = GetTickCount + Interval CTimers.add TmpTimer, Name frmServer.lstTimers.AddItem Name If Err.number > 0 Then Debug.Print "Err: " & Err.number CTimers.item(Name).Name = Name CTimers.item(Name).Interval = Interval CTimers.item(Name).tmrWait = GetTickCount + Interval Err.Clear End If End Sub Sub GetRidOfTimer(ByVal Name As String) Call CTimers.Remove(Name) End Sub ``` And there you have it. When you run a timer, it will show up on the list now. Double clicking the timer name will remove the timer (I added this just in case a timer is being troublesome), and you can add a timer yourself by filling in the two fields and clicking the Add Timer button. Enjoy. :-)
  19. Hey again. It's been like 3 months since I've been on here, so I figured I'd throw a couple short midis up. http://www.freewebs.com/balliztik/Neat.mid http://www.freewebs.com/balliztik/Harpsichord.mid http://www.freewebs.com/balliztik/Fields.mid They aren't finished, but are works in progress. The first one, which I named "Neat" due to lack of a title, has been in my music folder for a while now. I haven't gone anywhere with it, but the harmonized marimba part sounds pretty cool. The second one, "Harpsichord", is one I wrote about an hour ago. I was just messing around with the Half-Whole scale. The third one, "Fields", was also made about an hour ago. I had an idea for a semi-silly song and it turned out pretty good, I think. Anyway, glad to be back. I'm going to try to get a team together (or join one) and stick around for as long as I can this time.
  20. I decided, out of pure boredom, to explore how paperdoll works. I decided to make a little program to test some things for me, and when it turned out okay, I made another to test even more things. PD Calculator 1 - http://freemmorpgmaker.com/Hosting/balliztik/pdcalculator.exe PD Calculator 2 - http://freemmorpgmaker.com/Hosting/balliztik/pdcalculator2.exe PD Calculator 1 is for anyone who has a PD sheet already, but doesn't know where to place an item's paperdoll to get it to line up correctly. Just enter the x-coord and y-coord of any pixel in that item, check "32 x 32 sprites", if you have them, push "Calculate!", and it will tell you at what pixel that you should place your paperdolled item at. PD Calculator 2 is for anyone that wants to make their own PD sheet. Just enter the number of items you will need to paperdoll, and it will give you the y-coord to put your first item at, the y-coord to place the paperdoll for that item, and the length that the sheet will need to be. NOTE: Currently, a PD sheet doesn't work after about 30,000 pixels, so keep that in mind when planning for a big sheet. Hope you like em. :-)
  21. I've seen a lot of guides on how to draw a paperdoll, and stuff like that, but there aren't that many that show how to align them so they show properly. Part 1: How Many Items? First thing's first, you have to pick a place to start. To determine where you want to start your Paperdoll, consider how many item pictures you will need. Get a general number in your head. We'll call this number "Q". We need to find the "Y" that you'll start your PD at. So use this equation (SIZE is either 1 or 0, depending on if you use 32x64 sprites or not): ``` Q = (((y * 6 + x) * (SIZE + 1)) / 32) * 6 ``` Basic algebra; To find y, x must equal 0. ``` Q = ((6y * (Either 1 or 2)) / 32) * 6 ``` So, I'm going to use 500 as an example amount of items. ``` 32 x 64 Sprites: 500 = ((6y * 2) / 32) * 6 500 = (12y / 32) * 6 500 = (72/32)y 500 = (9/4)y 222 = y ``` ``` 32 x 32 Sprites: 500 = ((6y * 1) / 32) * 6 500 = (6y / 32) * 6 500 = (36/32)y 500 = (9/8)y 444 = y ``` So if you wanted 500 items, you would have to place your initial PD item at the 32 x 32 Square closest (rounding up) to y-coordinate 222 or 444, depending on your sprite size. Part 2: Where to start paperdoll? I'm going to use the example 500 again. We need to find where to start our paperdolling. We'll use another equation. "P" will stand for where we need to start our paperdolling and "Y" will be the y-coord we got from last time, rounded to the nearest 32x32 square. Here's the equation: ``` P = (y * 6 + x) * (SIZE + 1) ``` Since we already know y, we can put in that value. Also, we are going to make x = 0 (222 is closest to the square at 224, and 444 is closest to the square at 448, and SIZE works the same as earlier) ``` 32 x 64 Sprites: P = (224 * 6 + 0) * 2 P = 1344 * 2 P = 2688 ``` ``` 32 x 32 Sprites: P = (448 * 6 + 0) * 1 P = 2688 * 1 P = 2688 ``` Now this will be the Y-coord you start your PD at. Part 3: How big does the sheet need to be? Ok, we've gotten the starting points, now we just need the very end of the sheet. To find this, guess what we need…yup, another equation! We'll use the variable "P", we just found, the number of items, "Q", that you picked earlier, and then the variable, "S", will be either 32 or 64, depending on sprite size. Finally, the variable, "E", will stand for the end of the sheet. ``` E = P + (Q * S) ``` Sticking with the 500 items example, the equation would go like this: ``` 32 x 64 Sprites: E = 2688 + (500 * 64) E = 2688 + 32000 E = 34688 ``` ``` 32 x 32 Sprites: E = 2688 + (500 * 32) E = 2688 + 16000 E = 18688 ``` Now, just make your sheet the number of pixels, "E", long. Part 4: Aligning additional Items Once you've gotten the right coordinates down, it's easy to align any other items you put in the PD. Each item square corresponds to a paperdoll row. The first item square (at the initial y-coord we found), will correspond to the first PD row(at the second y-coord we found; "P"). Then, just move down a PD row with each new item. I have no pictures to help with this, so refer to this one: http://www.touchofdeathforums.com/smf/index.php?topic=4534.0 I hope this has helped you on your way to getting our Paperdoll sheet customized to how you need it.
  22. I was trying to think of a name for this midi I made. I thought about calling it "Rainy Day", but I don't know. Any thoughts? http://www.freewebs.com/balliztik1/Nameless.mid (And yes it repeats a lot…it was going to be my title.mid at one point, until I made a different one)
  23. Ok…this is probably going to sound weird, but my mom's laptop ate my Dragonforce CD. Seriously! I put it in the drive, cuz I was bored, and Windows Media Player didn't pop up. When I went to My Computer, it said nothing! I opened the drive, and the CD was gone. It ate it! Lol, you can hear it rattling around inside.
  24. ![](http://www.freewebs.com/balliztik/mainmenu.gif) The layout is a bit different because I'm using the TE source, but please rate it out of 10\. (Big thanks to Spike for the background)
  25. I've been looking, but I can't find a TE gui outline anywhere. I only need the game.gif outline, so if anyone has one I can use, I'd be grateful.
×
×
  • Create New...