-
Notifications
You must be signed in to change notification settings - Fork 4
/
GameCore.java
179 lines (142 loc) · 6.28 KB
/
GameCore.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package miniventure.game;
import java.util.HashMap;
import miniventure.game.texture.TextureAtlasHolder;
import miniventure.game.texture.TextureHolder;
import miniventure.game.util.Version;
import miniventure.game.util.VersionInfo;
import miniventure.game.world.tile.TileType.TileTypeEnum;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglFiles;
import com.badlogic.gdx.backends.lwjgl.LwjglNativesLoader;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData.Region;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import org.jetbrains.annotations.NotNull;
public class GameCore {
public static final Version VERSION = new Version("1.5.3");
public static final int DEFAULT_SCREEN_WIDTH = 800;
public static final int DEFAULT_SCREEN_HEIGHT = 450;
public static boolean debug = false;
private static final long START_TIME = System.nanoTime();
public static final float SOUND_RADIUS = 10; // 10 tiles
public static TextureAtlasHolder entityAtlas, tileAtlas;
public static TextureAtlas tileConnectionAtlas = new TextureAtlas(); // tile overlap atlas not needed b/c the overlap sprite layout is simple enough to code; it goes in binary. However, the tile connection sprite layout is more complicated, so a map is needed to compare against.
private static TextureAtlas iconAtlas;
public static final HashMap<String, TextureHolder> icons = new HashMap<>();
private static SpriteBatch batch;
private static FreeTypeFontGenerator fontGenerator;
private static GlyphLayout layout = new GlyphLayout();
private static Skin skin;
private static boolean initialized = false;
public static void initGdx() {
if(initialized) return;
initialized = true;
entityAtlas = new TextureAtlasHolder(new TextureAtlas("sprites/entities.txt"));
tileAtlas = new TextureAtlasHolder(new TextureAtlas("sprites/tiles.txt"));
tileConnectionAtlas = new TextureAtlas("sprites/tileconnectmap.txt");
iconAtlas = new TextureAtlas("sprites/icons.txt");
batch = new SpriteBatch();
//font = new BitmapFont(); // uses libGDX's default Arial font
fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/arial.ttf"));
skin = new Skin(Gdx.files.internal("skins/visui/uiskin.json"));
getFont(); // initialize default font
//noinspection ConstantConditions
for(AtlasRegion region: iconAtlas.getRegions())
icons.put(region.name, new TextureHolder(region));
TileTypeEnum.init();
}
public static void initNonGdx() {
if(initialized) return;
initialized = true;
// initialize entity atlas and icon atlas, b/c that's what the server needs to determine entity sizes (icons b/c of item entities)
LwjglNativesLoader.load();
Gdx.files = new LwjglFiles();
// maybe if I manually created a TextureAtlasData?
FileHandle spriteFolder = Gdx.files.internal("sprites");
TextureAtlasData entityData = new TextureAtlasData(spriteFolder.child("entities.txt"), spriteFolder, false);
TextureAtlasData iconData = new TextureAtlasData(spriteFolder.child("icons.txt"), spriteFolder, false);
TextureAtlasData tileData = new TextureAtlasData(spriteFolder.child("tiles.txt"), spriteFolder, false);
entityAtlas = new TextureAtlasHolder(entityData);
tileAtlas = new TextureAtlasHolder(tileData);
for(Region region: iconData.getRegions())
icons.put(region.name, new TextureHolder(region));
TileTypeEnum.init();
}
public static void dispose () {
batch.dispose();
skin.dispose();
fontGenerator.dispose();
if(defaultFont != null)
defaultFont.dispose();
entityAtlas.dispose();
tileAtlas.dispose();
tileConnectionAtlas.dispose();
iconAtlas.dispose();
}
public static GlyphLayout getTextLayout(String text) {
if(fontGenerator != null)
layout.setText(getFont(), text);
return layout;
}
public static Skin getSkin() { return skin; }
public static SpriteBatch getBatch() {
if(batch == null) batch = new SpriteBatch();
return batch;
}
private static BitmapFont defaultFont;
private static FreeTypeFontParameter getDefaultFontConfig() {
FreeTypeFontParameter params = new FreeTypeFontParameter();
params.size = 15;
params.color = Color.WHITE;
params.borderColor = Color.BLACK;
params.borderWidth = 1;
params.spaceX = -1;
//params.magFilter = TextureFilter.Linear;
params.shadowOffsetX = 1;
params.shadowOffsetY = 1;
params.shadowColor = Color.BLACK;
return params;
}
public static BitmapFont getFont() {
if(defaultFont == null)
defaultFont = fontGenerator.generateFont(getDefaultFontConfig());
defaultFont.setColor(Color.WHITE);
return defaultFont;
}
public static float getElapsedProgramTime() { return (System.nanoTime() - START_TIME)/1E9f; }
private static VersionInfo latestVersion = null;
public static boolean determinedLatestVersion() { return latestVersion != null; }
@NotNull
public static VersionInfo getLatestVersion() {
if(latestVersion != null)
return latestVersion;
// fetch the latest version from github
try {
HttpResponse<JsonNode> response = Unirest.get("https://api.github.com/repos/chrisj42/miniventure/releases").asJson();
if(response.getStatus() != 200) {
System.err.println("version request returned status code "+response.getStatus()+": "+response.getStatusText());
System.err.println("response body: "+response.getBody());
return latestVersion = new VersionInfo(VERSION, "", "");
}
else {
return latestVersion = new VersionInfo(response.getBody().getArray().getJSONObject(0));
}
} catch(UnirestException e) {
e.printStackTrace();
return latestVersion = new VersionInfo(VERSION, "", "");
}
}
}