MapEditor.Mod 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. MODULE MapEditor;
  2. IMPORT G := Graph, S := SimpleGui, Out, Int, Strings, E := GameEngine;
  3. CONST window = FALSE;
  4. TYPE
  5. MapWidget = POINTER TO MapWidgetDesc;
  6. MapWidgetDesc = RECORD(S.WidgetDesc)
  7. curX, curY: INTEGER
  8. END;
  9. VAR
  10. frmMain: S.Form;
  11. pnlTop: S.Panel;
  12. lblMapName: S.Label;
  13. edtMapName: S.Edit;
  14. btnOpen: S.Button;
  15. btnSave: S.Button;
  16. btnExit: S.Button;
  17. pnlSide: S.Panel;
  18. scbVert: S.ScrollBar;
  19. sbxMap: S.ScrollBox;
  20. wgtMap: MapWidget;
  21. game: E.Game;
  22. PROCEDURE Limit(x, min, max: INTEGER): INTEGER;
  23. BEGIN
  24. IF x < min THEN x := min ELSIF x > max THEN x := max END
  25. RETURN x END Limit;
  26. (** Map Widget **)
  27. PROCEDURE DrawCell(cell: E.Cell; x, y, toX, toY: INTEGER);
  28. VAR kx, ky: INTEGER;
  29. BEGIN
  30. kx := cell.kind MOD E.tilesInRow * E.cellW;
  31. ky := cell.kind DIV E.tilesInRow * E.cellH;
  32. G.DrawPart(E.tiles, kx, ky, E.cellW, E.cellH, toX, toY)
  33. END DrawCell;
  34. PROCEDURE MapWidgetHandleDraw(c: S.Widget; VAR msg: S.DrawMsg);
  35. VAR x: INTEGER;
  36. X, Y, i, j: INTEGER;
  37. cx, cy, cw, ch: INTEGER;
  38. x0, y0, x1, y1: INTEGER;
  39. col: G.Color;
  40. m: MapWidget;
  41. BEGIN
  42. m := c(MapWidget);
  43. G.GetClip(cx, cy, cw, ch);
  44. (* INC(cx, E.cellW * 2);
  45. INC(cy, E.cellW * 2);
  46. DEC(cw, E.cellW * 4);
  47. DEC(ch, E.cellW * 4); *)
  48. (* INC(cx, 1);
  49. INC(cy, 1);
  50. DEC(cw, 2);
  51. DEC(ch, 2);*)
  52. x0 := (cx - msg.x) DIV E.cellW;
  53. IF x0 < 0 THEN x0 := 0 END;
  54. y0 := (cy - msg.y) DIV E.cellH;
  55. IF y0 < 0 THEN y0 := 0 END;
  56. x1 := (cx - msg.x + cw - 1) DIV E.cellW;
  57. IF x1 >= game.map.w THEN x1 := game.map.w - 1 END;
  58. y1 := (cy - msg.y + ch - 1) DIV E.cellH;
  59. IF y1 >= game.map.h THEN y1 := game.map.h - 1 END;
  60. G.MakeCol(col, 255, 0, 128);
  61. G.FillRect(0, 0, 2000, 2000, col);
  62. x := msg.x + x0 * E.cellW;
  63. Y := msg.y + y0 * E.cellH;
  64. FOR i := y0 TO y1 DO
  65. X := x;
  66. FOR j := x0 TO x1 DO
  67. DrawCell(game.map.cells[i, j], i, j, X, Y);
  68. INC(X, E.cellW)
  69. END;
  70. INC(Y, E.cellH)
  71. END;
  72. IF m.curX >= 0 THEN
  73. G.MakeCol(col, 240, 0, 0);
  74. X := msg.x + m.curX * E.cellW;
  75. Y := msg.y + m.curY * E.cellH;
  76. G.Rect(X - 1, Y - 1, X + E.cellW, Y + E.cellH, col);
  77. END;
  78. ;G.MakeCol(col, 0, 0, 0);
  79. G.Rect(cx - 2, cy - 2, cx + cw + 1, cy + ch + 1, col);
  80. END MapWidgetHandleDraw;
  81. PROCEDURE MapWidgetHandleMouseMove(c: S.Widget; VAR msg: S.MouseMoveMsg);
  82. VAR m: MapWidget;
  83. x, y: INTEGER;
  84. BEGIN
  85. m := c(MapWidget);
  86. x := Limit(msg.x DIV E.cellW, 0, game.map.w - 1);
  87. y := Limit(msg.y DIV E.cellH, 0, game.map.h - 1);
  88. IF (x # m.curX) OR (y # m.curY) THEN
  89. m.curX := x; m.curY := y;
  90. S.Redraw(c)
  91. END
  92. END MapWidgetHandleMouseMove;
  93. PROCEDURE MapWidgetHandler(c: S.Widget; VAR msg: S.Message);
  94. BEGIN
  95. IF msg IS S.MouseMoveMsg THEN
  96. MapWidgetHandleMouseMove(c, msg(S.MouseMoveMsg))
  97. ELSIF msg IS S.MouseLeaveMsg THEN
  98. c(MapWidget).curX := -1; S.Redraw(c)
  99. ELSIF msg IS S.DrawMsg THEN
  100. MapWidgetHandleDraw(c, msg(S.DrawMsg))
  101. ELSE
  102. S.WidgetHandler(c, msg)
  103. END
  104. END MapWidgetHandler;
  105. PROCEDURE NewMapWidget(where: S.Widget; x, y, w, h: INTEGER): MapWidget;
  106. VAR c: MapWidget;
  107. BEGIN
  108. NEW(c); S.InitWidget(c, w, h);
  109. c.curX := -1; c.curY := 0;
  110. c.handle := MapWidgetHandler;
  111. S.Put(c, where, x, y)
  112. RETURN c END NewMapWidget;
  113. (** - **)
  114. PROCEDURE BtnExitOnClick(c: S.Widget);
  115. BEGIN
  116. S.Quit
  117. END BtnExitOnClick;
  118. PROCEDURE InitInterface(): BOOLEAN;
  119. VAR W, H: INTEGER;
  120. color: G.Color;
  121. BEGIN
  122. G.GetScreenSize(W, H);
  123. frmMain := S.NewForm(0, 0, W, H);
  124. pnlTop := S.NewPanel(frmMain, 0, 0, W, 40);
  125. lblMapName := S.NewLabel(pnlTop, 8, 9, 120, 22, 'Имя файла:');
  126. S.LabelSetAlign(lblMapName, S.alRight);
  127. edtMapName := S.NewEdit(pnlTop, lblMapName.x + lblMapName.w + 8,
  128. 9, 120, 22);
  129. btnOpen := S.NewButton(pnlTop, edtMapName.x + edtMapName.w + 8,
  130. 8, 96, 24, 'Открыть');
  131. btnSave := S.NewButton(pnlTop, btnOpen.x + btnOpen.w + 8,
  132. 8, 96, 24, 'Сохранить');
  133. btnExit := S.NewButton(pnlTop, W - 68, 8, 60, 24, 'Выход');
  134. S.SetOnClick(btnExit, BtnExitOnClick);
  135. pnlSide := S.NewPanel(frmMain, 0, pnlTop.h, 180, H - pnlTop.h);
  136. G.MakeCol(color, 40, 150, 40);
  137. S.SetBgColor(pnlSide, color);
  138. scbVert := S.NewScrollBar(pnlSide, 20, 20, 16, 150);
  139. S.ScrollBarSetVertical(scbVert, TRUE);
  140. scbVert.max := 8;
  141. sbxMap := S.NewScrollBox(frmMain, pnlSide.w, pnlTop.h,
  142. W - pnlSide.w, H - pnlTop.h);
  143. S.ScrollBoxSetInnerSize(sbxMap, 1024, 1024);
  144. G.MakeCol(color, 0, 0, 0);
  145. S.ScrollBoxSetNoBg(sbxMap, TRUE);
  146. wgtMap := NewMapWidget(sbxMap, 0, 0, 1024, 1024)
  147. RETURN TRUE END InitInterface;
  148. PROCEDURE Init(): BOOLEAN;
  149. VAR ok: BOOLEAN;
  150. BEGIN ok := TRUE;
  151. IF window THEN G.Settings(640, 480, {G.window(*, G.maximized*)}) END;
  152. G.Init;
  153. IF ~G.Done THEN ok := FALSE END;
  154. IF ok THEN
  155. S.Init;
  156. IF ~S.Done THEN ok := FALSE END
  157. END;
  158. IF ok & ~E.Init() THEN ok := FALSE END;
  159. IF ok THEN E.InitGame(game) END;
  160. IF ok & ~InitInterface() THEN ok := FALSE END
  161. RETURN ok END Init;
  162. PROCEDURE Close;
  163. BEGIN
  164. G.Close
  165. END Close;
  166. BEGIN
  167. IF Init() THEN S.Run ELSE Out.String('Error loading.'); Out.Ln END;
  168. Close
  169. END MapEditor.